![](/img/trans.png)
[英]algorithm to add up objects in an array without mutating the original array
[英]how to add object in nested array of objects without mutating original source
我有多個嵌套的對象數組,其中我需要根據沒有突變的 id 合並 grandChildren 中的對象
細節 ......
###例子
let arr1 = {
"initiateLevel": true,
"parent": [
{
"name": "level1",
"childrens": [
{
"group": "Level-group",
"grandChildrens": [
{
"id": 21,
"technology": "sp1",
"path": "l2"
},
{
"id": 22,
"technology": "sp2",
"path": "l2"
}
]
}
]
},
{
"name": "level2",
"childrens": [
{
"group": "Level-group-2",
"grandChildrens": [
{
"id": 121,
"technology": "sp12",
"path": "l4"
},
{
"id": 122,
"technology": "sp22",
"path": "l4"
}
]
}
]
}
]
}
例如:下面的對象需要與基於 id 的數組合並
let newobj=
[
{
"id": 22,
"reason": "reason 2",
"phase": "phase 2",
"reviewer": "by user 2",
"date": "date 2"
},
{
"id": 21,
"reason": "reason 1",
"phase": "phase 1",
"reviewer": "by user 1",
"date": "date 1"
}
]
預期輸出:
{
"initiateLevel": true,
"parent": [
{
"name": "level1",
"childrens": [
{
"group": "Level-group",
"grandChildrens": [
{
"id": 21,
"technology": "sp1",
"path": "l2",
"reason": "reason 1",
"phase": "phase 1",
"reviewer": "by user 1",
"date": "date 1"
},
{
"id": 22,
"technology": "sp2",
"path": "l2",
"reason": "reason 2",
"phase": "phase 2",
"reviewer": "by user 2",
"date": "date 2"
}
]
}
]
},
{
"name": "level2",
"childrens": [
{
"group": "Level-group-2",
"grandChildrens": [
{
"id": 121,
"technology": "sp12",
"path": "l4"
},
{
"id": 122,
"technology": "sp22",
"path": "l4"
}
]
}
]
}
]
}
我試着喜歡這個。 但它不工作
const merge = (y, z) => {
y.parent.forEach((element) => {
element.childrens.forEach((x) => {
x.grandChildrens.forEach((test) => {
const reviewIndex = z.findIndex(
(reviewItem) => reviewItem.id === test.id
);
if(reviewIndex>=0)
{
return {...test, ...z[reviewIndex]}
}
});
});
});
};
merge(arr1,newobj)
如何根據 id 合並對象而不進行變異。
改用Array.prototype.map
, forEach
沒有回報
let newobj = [ { id: 22, reason: 'reason 2', phase: 'phase 2', reviewer: 'by user 2', date: 'date 2' }, { id: 21, reason: 'reason 1', phase: 'phase 1', reviewer: 'by user 1', date: 'date 1' } ]; let arr1 = { initiateLevel: true, parent: [ { name: 'level1', childrens: [ { group: 'Level-group', grandChildrens: [ { id: 21, technology: 'sp1', path: 'l2', reason: 'reason 1', phase: 'phase 1', reviewer: 'by user 1', date: 'date 1' }, { id: 22, technology: 'sp2', path: 'l2', reason: 'reason 2', phase: 'phase 2', reviewer: 'by user 2', date: 'date 2' } ] } ] }, { name: 'level2', childrens: [ { group: 'Level-group-2', grandChildrens: [ { id: 121, technology: 'sp12', path: 'l4' }, { id: 122, technology: 'sp22', path: 'l4' } ] } ] } ] }; const merge = (y, z) => { const parent = y.parent.map((element) => { return { ...element, childrens: element.childrens.map((x) => { return { ...x, grandChildrens: x.grandChildrens.map((test) => { return { ...test, ...z.find((reviewItem) => reviewItem.id === test.id) }; }) }; }) } }); return { ...y, parent }; }; const arr2 = merge(arr1, newobj); console.log(arr2);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.