JavaScript对比对象数组 同步主数组增删项至嵌套分组详情数组
实现思路
核心逻辑以myArray1的name列表为唯一基准,对myArray2每个分组的groupDetails做全量对齐,同时覆盖新增补全、冗余删除两个场景:
- 第一步:从
myArray1提取所有name值,生成有序的name列表和用于快速查重的Set集合,作为对齐的唯一标准 - 第二步:遍历
myArray2的每个分组,先过滤掉当前groupDetails里name不在基准集合中的冗余条目,同时把合法条目存为Map方便快速查找 - 第三步:按照基准name列表的顺序,逐个拼接最终的
groupDetails数组:如果name对应已有条目就保留原数据,不存在就生成value1、value2为0的默认条目
这种实现方式天然保证最终groupDetails的name集合、顺序和myArray1完全一致,不需要单独写差集对比的冗余逻辑。
完整代码
// 基准数组和待同步数组为题目给出的初始化值 let myArray1 = [ {"name": "F1"}, {"name": "F2"}, {"name": "F3"}, {"name": "F4"}, {"name": "F5"}, ]; let myArray2 = [ { "groupName": "Group 1", "groupDetails": [ { "name": "F1", "value1": 10, "value2": 22 }, { "name": "F2", "value1": 14, "value2": 25 }, { "name": "F3", "value1": 9, "value2": 2 } ] }, { "groupName": "Group 2", "groupDetails": [ { "name": "F1", "value1": 110, "value2": 222 }, { "name": "F2", "value1": 0, "value2": 55 }, { "name": "F3", "value1": 12, "value2": 12 } ] } ] // 同步逻辑开始 // 1. 生成基准name的有序列表、快速判断集合 const baseNameList = myArray1.map(item => item.name); const baseNameSet = new Set(baseNameList); // 2. 逐分组对齐 myArray2.forEach(group => { // 筛出当前分组下合法的已有条目,丢弃myArray1已移除的冗余项 const validDetailMap = new Map(); group.groupDetails.forEach(detail => { if (baseNameSet.has(detail.name)) { validDetailMap.set(detail.name, detail); } }); // 按基准顺序重新生成groupDetails,缺失项补默认值 group.groupDetails = baseNameList.map(name => { return validDetailMap.get(name) ?? { name, value1: 0, value2: 0 }; }); }); // 执行完成后myArray2即为题目要求的预期结果
逻辑特性
- 自动处理删除:所有不在
myArray1name集合里的冗余条目会被直接过滤,不需要单独写删除逻辑 - 自动处理新增:基准集合里存在、分组内缺失的name会自动补全,value字段默认赋值0
- 顺序对齐:最终
groupDetails的条目顺序和myArray1的name顺序完全一致 - 无侵入修改:已有条目的
value1、value2原值会完整保留,不会被默认值覆盖
内容的提问来源于stack exchange,提问作者ArthurJ
相关产品推荐
相关产品推荐

