Javascript 合并两个对象数组,其中一个用作主数组,覆盖所有重复的对象

Javascript 合并两个对象数组,其中一个用作主数组,覆盖所有重复的对象,javascript,ecmascript-6,Javascript,Ecmascript 6,我有两个对象数组。该数组中的每个对象都有一个对象数组 我正在尝试合并两个数组,其中一个用作主数组,覆盖第一个级别和第二个“选项”级别中的任何副本。就像一个工会会员 我已经试过了代码,但是这不适合材料中的重复选项 运行此代码将为第二种材质生成两个id:400选项。当只有1个值为100cm时 请问有什么聪明的方法吗?我还研究了如何使用集合,但这同样只适用于顶层 施工材料清单=[ { id:2, 选项:[ { id:300, 值:“50cm” }, { id:400, 值:“75厘米” } ] }

我有两个对象数组。该数组中的每个对象都有一个对象数组

我正在尝试合并两个数组,其中一个用作主数组,覆盖第一个级别和第二个“选项”级别中的任何副本。就像一个工会会员

我已经试过了代码,但是这不适合材料中的重复选项

运行此代码将为第二种材质生成两个id:400选项。当只有1个值为100cm时

请问有什么聪明的方法吗?我还研究了如何使用集合,但这同样只适用于顶层

施工材料清单=[ { id:2, 选项:[ { id:300, 值:“50cm” }, { id:400, 值:“75厘米” } ] } ] 施工主材料清单=[ { id:1, 选项:[ { id:200, 值:“50cm” } ] }, { id:2, 选项:[ { id:400, 值:“100厘米” } ] } ] 主材料清单。forEachmasterMaterial=>{ const matchMaterial=materials\u list.findexsistingmaterial=>existingMaterial.id==masterMaterial.id; ifmatchMaterial{ masterMaterial.options=masterMaterial?.options.concatmatchMaterial.options; } }; console.logmaster\u物料清单 您可以通过以下方式执行此操作:

施工材料清单=[ { id:2, 选项:[ { id:300, 值:“50cm”, }, { id:400, 值:“75cm”, }, ], }, ]; 施工主材料清单=[ { id:1, 选项:[ { id:200, 值:“50cm”, }, ], }, { id:2, 选项:[ { id:400, 值:“100cm”, }, ], }, ]; const customizer=objValue、srcValue、propertyName=>{ 如果propertyName===“选项”{ 返回值 .keyBy'id' .mergeWith_uu.keyByobjValue'id' 价值观 价值 } }; const merged=_master_materials_list .keyBy'id' .mergeWith_u.keyBymaterials_列表“id”,自定义项 价值观 价值 console.logmerged;
不同的方法首先为o1查找创建材质列表选项的映射

然后在映射主列表时,使用过滤器查找存储在上述映射中的、主列表中不存在的选项

const materials_list=[{id:2,选项:[{id:300,值:50cm},{id:400,值:75cm}]},{id:999,选项:[]}, master_materials_list=[{id:1,选项:[{id:200,值:50cm}],{id:2,选项:[{id:400,值:100cm}]; //将材质列表选项数组存储在由选项id设置关键帧的贴图中 const listMap=new-Mapmaterials\u list.mapo=>[o.id,o]; //用于跟踪在主列表中找到的ID const masterIDs=新集合 //映射材质列表并返回新对象,以防止原始对象发生变化 const res=master_materials_list.map{id,options,…rest}=>{ //跟踪此id 阿迪德大师 //如果材质列表贴图没有此id,则无需搜索 iflistMap.hasid{ //master中此选项数组中的ID集 constopids=newsetoptions.map{id}=>id; //在地图中过滤其他不存在的内容 const newOpts=listMap.getid.options.filter{id}=>!opIds.hasid; //并将它们合并 选项=[…选项,…新选项] } //返回新对象 返回{id,options,…rest}; }; //将主控中未找到的物料列表项添加到结果中 forEachv,k=>{ 如果!MasterID.hask{ res.push{…v} } } 控制台。logres
.as console wrapper{max height:100%!important;top:0}您必须在concat之前筛选matchMaterials.options。比如:

matchMaterial.options = matchMaterial.options.filter(opt =>
    masterMaterial.options.find(val => val.Id === opt.Id) == null;
);
这将在concat之前从matchMaterial中删除任何“重复”选项

编辑:
我是在手机上这么做的,所以如果代码的格式像我现在看到的那样奇怪,我很抱歉

,因此在物料清单中有一个主清单中没有的新项目之前,这是有效的。是否仍要向列表中添加任何不在主列表中的项目?请检查更新。添加了一组跟踪在主控中找到的ID。然后在末尾添加了一个步骤来遍历listMap并将新的结果推送到结果中