有了两个JSON数组,我想将它们合并到一个finall数组中。基数组具有以下子级别:
r1=[{
"item_guid": "5c2000c1-abc8-4d6f-85de-b8b223a42a2f",
"item_id": 1,
"parent_item_id": null,
"description": "1",
"sub_items": [
{
"item_guid": "bd7c2ba3-268b-49f6-98fb-34486a3e1449",
"item_id": 10,
"parent_item_id": 1,
"description": "1.1",
"sub_items": []
},
{
"item_guid": "80e073e0-2aa8-422a-9f28-51747f146bd8",
"item_id": 12,
"parent_item_id": 1,
"description": "1.2",
"sub_items": [
{
"item_guid": "f97af55c-c90e-46c2-b56e-e854ff36e1e3",
"item_id": 78,
"parent_item_id": 12,
"description": "1.2.1",
"sub_items": []
},
{
"item_guid": "28469fa4-2c1c-4f2a-9250-7460a74cc30a",
"item_id": 79,
"parent_item_id": 12,
"description": "1.2.2",
"sub_items": [
{
"item_guid": "f97af55c-c90e-46c2-b56e-e854ff36e1e9",
"item_id": 80,
"parent_item_id": 12,
"description": "1.2.2.1",
"sub_items": []
},
]
}
],
},
{
"item_guid": "846daeab-edd4-4cf2-8f12-8d7231c697e3",
"item_id": 13,
"parent_item_id": 1,
"description": "1.3",
"sub_items": [],
},
],
}]第二个数组用于将其项复制到第一个数组中的匹配元素:
r2=[
{
"item_guid": "bd7c2ba3-268b-49f6-98fb-34486a3e1449",
"mandatory": "True",
"comment": "Item cross-reference 1.1"
},
{
"item_guid": "f97af55c-c90e-46c2-b56e-e854ff36e1e3",
"mandatory": "True",
"comment": "Item cross-reference 1.2.1"
},
{
"item_guid": "f97af55c-c90e-46c2-b56e-e854ff36e1e9",
"mandatory": "True",
"comment": "Item cross-reference 1.2.2.1"
}]其结果应如下:
r3=[{
"item_guid": "5c2000c1-abc8-4d6f-85de-b8b223a42a2f",
"item_id": 1,
"parent_item_id": null,
"description": "1",
"sub_items": [
{
"item_guid": "bd7c2ba3-268b-49f6-98fb-34486a3e1449",
"item_id": 10,
"parent_item_id": 1,
"description": "1.1",
"mandatory": "True",
"comment": "Item cross-reference 1.1"
"sub_items": []
},
{
"item_guid": "80e073e0-2aa8-422a-9f28-51747f146bd8",
"item_id": 12,
"parent_item_id": 1,
"description": "1.2",
"sub_items": [
{
"item_guid": "f97af55c-c90e-46c2-b56e-e854ff36e1e3",
"item_id": 78,
"parent_item_id": 12,
"description": "1.2.1",
"mandatory": "True",
"comment": "Item cross-reference 1.2.1"
"sub_items": []
},
{
"item_guid": "28469fa4-2c1c-4f2a-9250-7460a74cc30a",
"item_id": 79,
"parent_item_id": 12,
"description": "1.2.2",
"sub_items": [
{
"item_guid": "f97af55c-c90e-46c2-b56e-e854ff36e1e9",
"item_id": 80,
"parent_item_id": 12,
"description": "1.2.2.1",
"mandatory": "True",
"comment": "Item cross-reference 1.2.2.1"
"sub_items": []
},
]
}
],
},
{
"item_guid": "846daeab-edd4-4cf2-8f12-8d7231c697e3",
"item_id": 13,
"parent_item_id": 1,
"description": "1.3",
"sub_items": [],
},
],
}]我试图按如下方式迭代第一个数组来匹配第二个数组中的元素,但是我认为它需要一些递归来继续检查子级别。我能用地图吗?
const mergeById = (r1, r2) =>
r1.map(itm => {
itm.sub_items = itm.sub_items.map(sub_item => (
{ ...sub_item,
...r2.find(r2_item => r2_item.item_guid === sub_item.item_guid),
}
)
)
return itm
})
console.log(mergeById(r1,r2))发布于 2022-06-02 07:08:46
我会说,您的.map()尝试是朝着正确的方向发展,也是您认为需要递归的预感。起作用的是
function mergeById(r1, r2) {
return r1.map(({item_guid, sub_items, ...rest}) => Object.assign(
rest,
{item_guid},
r2.find(_ => _.item_guid === item_guid),
{sub_items: mergeById(sub_items, r2)}
));
}
const r1 = [{item_guid: "5c2000c1-abc8-4d6f-85de-b8b223a42a2f", item_id: 1, parent_item_id: null, description: "1", sub_items: [{item_guid: "bd7c2ba3-268b-49f6-98fb-34486a3e1449", item_id: 10, parent_item_id: 1, description: "1.1", sub_items: []}, {item_guid: "80e073e0-2aa8-422a-9f28-51747f146bd8", item_id: 12, parent_item_id: 1, description: "1.2", sub_items: [{item_guid: "f97af55c-c90e-46c2-b56e-e854ff36e1e3", item_id: 78, parent_item_id: 12, description: "1.2.1", sub_items: []}, {item_guid: "28469fa4-2c1c-4f2a-9250-7460a74cc30a", item_id: 79, parent_item_id: 12, description: "1.2.2", sub_items: [{item_guid: "f97af55c-c90e-46c2-b56e-e854ff36e1e9", item_id: 80, parent_item_id: 12, description: "1.2.2.1", sub_items: []}]}]}, {item_guid: "846daeab-edd4-4cf2-8f12-8d7231c697e3", item_id: 13, parent_item_id: 1, description: "1.3", sub_items: []}]}]
const r2 = [{item_guid: "bd7c2ba3-268b-49f6-98fb-34486a3e1449", mandatory: "True", comment: "Item cross-reference 1.1"}, {item_guid: "f97af55c-c90e-46c2-b56e-e854ff36e1e3", mandatory: "True", comment: "Item cross-reference 1.2.1"}, {item_guid: "f97af55c-c90e-46c2-b56e-e854ff36e1e9", mandatory: "True", comment: "Item cross-reference 1.2.2.1"}]
console.log(mergeById(r1, r2)).as-console-wrapper {max-height: 100% !important; top: 0}
编辑1:如@Xupitan所指出的添加item_guid
编辑2:使用rest作为丢弃对象,正如@Scott所建议的那样
发布于 2022-06-02 13:28:47
这主要是施赖伯的出色答案的变体。这是相同的技术,只使用不同的编码风格,使用对象扩展而不是Object .assign。
const deepMerge = (r1, r2) =>
r1 .map (({item_guid, sub_items, ...rest}) => ({
item_guid,
... rest,
... (r2 .find ((i) => i .item_guid == item_guid)),
sub_items: deepMerge (sub_items, r2)
}))
const r1 = [{item_guid: "5c2000c1-abc8-4d6f-85de-b8b223a42a2f", item_id: 1, parent_item_id: null, description: "1", sub_items: [{item_guid: "bd7c2ba3-268b-49f6-98fb-34486a3e1449", item_id: 10, parent_item_id: 1, description: "1.1", sub_items: []}, {item_guid: "80e073e0-2aa8-422a-9f28-51747f146bd8", item_id: 12, parent_item_id: 1, description: "1.2", sub_items: [{item_guid: "f97af55c-c90e-46c2-b56e-e854ff36e1e3", item_id: 78, parent_item_id: 12, description: "1.2.1", sub_items: []}, {item_guid: "28469fa4-2c1c-4f2a-9250-7460a74cc30a", item_id: 79, parent_item_id: 12, description: "1.2.2", sub_items: [{item_guid: "f97af55c-c90e-46c2-b56e-e854ff36e1e9", item_id: 80, parent_item_id: 12, description: "1.2.2.1", sub_items: []}]}]}, {item_guid: "846daeab-edd4-4cf2-8f12-8d7231c697e3", item_id: 13, parent_item_id: 1, description: "1.3", sub_items: []}]}]
const r2 = [{item_guid: "bd7c2ba3-268b-49f6-98fb-34486a3e1449", mandatory: "True", comment: "Item cross-reference 1.1"}, {item_guid: "f97af55c-c90e-46c2-b56e-e854ff36e1e3", mandatory: "True", comment: "Item cross-reference 1.2.1"}, {item_guid: "f97af55c-c90e-46c2-b56e-e854ff36e1e9", mandatory: "True", comment: "Item cross-reference 1.2.2.1"}]
console .log (deepMerge (r1, r2)).as-console-wrapper {max-height: 100% !important; top: 0}
https://stackoverflow.com/questions/72471213
复制相似问题