gpt4 book ai didi

javascript - 如何在 JS 中对数组进行非规范化

转载 作者:行者123 更新时间:2023-11-28 14:18:06 24 4
gpt4 key购买 nike

我有一个以下形式的数据集

let data = [
{
"id": {
"primary": "A1"
},
"msg": 1
}, {
"id": {
"primary": "A1"
},
"msg": 2
}, {
"id": {
"primary": "B2"
},
"msg": 3
}
]

我想将其转换为

newData = [
{
"id": {
"primary": "A1"
},
"items": [
{ "msg": 1 },
{ "msg": 2 }
]
},
{
"id": {
"primary": "B2"
},
"items": [
{ "msg": 3 }
]
}
]

我认为该方法类似于以下内容,但不确定在这种情况下如何检查未定义值。

let newData = [];
for (let i = 0; i < data.length; i++) {
if (newData[i]['id']['primary'] === data[i]['id']) newData.push(data[i]['id'])
else newData[i]['items'].push(data[i]['msg'])
}

如何转换原始数据集以合并具有匹配主 ID 的条目?

最佳答案

一种选择是使用 .reduce()从现有数组创建一个新数组。

我添加了评论来澄清。

let data = [ { "id": { "primary": "A1" }, "msg": 1 }, { "id": { "primary": "A1" }, "msg": 2 }, { "id": { "primary": "B2" }, "msg": 3 } ];

let result = data.reduce((out,item) => {
let {id, ...items} = item; //Separate the "id" and "everything else"
let existing = out.find(({id}) => id.primary == item.id.primary);

existing //have we seen this ID already?
? existing.items.push(items) //yes - add the items to it
: out.push({ id: {...id}, items: [items]}); //no - create it

return out;
}, []);

console.log(result);

一些注意事项:

  • 您可能会注意到,尽管 id 已经是一个对象,但我还是使用 id: {...id} 设置了 ID。这是因为使用现有的 id 对象会创建一个引用,而 {...id} 创建一个浅副本 em>.

  • 我没有在任何地方指定 msg 属性。相反,不是 id 的任何属性都将添加到 items 列表(下面的示例)

        let data = [ { "id": { "primary": "A1" }, "msg": 1, "otherStuff": "Hello World!" }, { "id": { "primary": "A1" }, "msg": 2, "AnotherThing": true }, { "id": { "primary": "B2" }, "msg": 3, "someOtherProperty": false } ];

    let result = data.reduce((out,item) => {
    let {id, ...items} = item;
    let existing = out.find(({id}) => id.primary == item.id.primary);

    existing
    ? existing.items.push(items)
    : out.push({ id: {...id}, items: [items]});

    return out;
    }, []);

    console.log(result);

    也就是说,如果您开始嵌套对象(ID 除外),它们可能会作为引用包含在内; ...items 只是一个副本。

    如果是这种情况,请考虑类似 JSON.parse(JSON.stringify(...)) 的内容用于深拷贝。但请务必阅读链接;有一些警告。

关于javascript - 如何在 JS 中对数组进行非规范化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56568808/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com