比较两个javascript对象数组并合并数据
我在比较一个键上的两个对象数组时遇到了麻烦 我想比较,在键匹配时减去值,在不在目标数组中时显示负值。最后,我希望所有的目标对象(如果关键点不匹配)都在我的最终数组中 一个示例可以节省1000字:比较两个javascript对象数组并合并数据,javascript,Javascript,我在比较一个键上的两个对象数组时遇到了麻烦 我想比较,在键匹配时减去值,在不在目标数组中时显示负值。最后,我希望所有的目标对象(如果关键点不匹配)都在我的最终数组中 一个示例可以节省1000字: constinitial=[{id:1,value:47},{id:2,value:20},{id:7,value:13}]; const target=[{id:1,值:150},{id:3,值:70},{id:40,值:477}]; //期望输出 //[{id:1,value:103},{id:2
constinitial=[{id:1,value:47},{id:2,value:20},{id:7,value:13}];
const target=[{id:1,值:150},{id:3,值:70},{id:40,值:477}];
//期望输出
//[{id:1,value:103},{id:2,value:-20},{id:7,value:-13},{id:3,value:70},{id:40,value:477}];
让比较器=[];
initial.map(initia=>{
让hasame=target.find(target=>{
返回initia.id==target.id
});
if(hasame){
initia.value-=hasame.value
}否则{
initia.value=-initia.value
}
});
控制台日志(首字母)
您可以使用一个并收集相同的id
,其中包含一个用于求和的所需因子
因此,将键/值作为新属性
var add=(map,factor)=>({id,value})=>map.set(id,map.has(id)
?映射获取(id)-值*因子
:值*系数
),
initial=[{id:1,value:47},{id:2,value:20},{id:7,value:13}],
target=[{id:1,value:150},{id:3,value:70},{id:40,value:477}],
地图=新地图,
结果;
first.forEach(add(map,-1));
forEach(add(map,1));
result=Array.from(map,([id,value])=>({id,value}));
控制台日志(结果)代码>
.as console wrapper{max height:100%!important;top:0;}
如果目的是避免在循环内部进行嵌套查找,则可以将两个数组减少为一个数组。它们不允许重复的密钥,因此您可以确保为提供的每个ID指定一个值
const valueSet = [...initial, ...target].reduce((total, obj) => {
total[obj.id] = !total[obj.id]
? -obj.value
: total[obj.id] -= obj.value
return total;
}, {});
const result = Object.keys(valueSet).map(key => ({ id: key, value: valueSet[key]}))
console.log(result);
然后将结果映射回所需的数组。给出一个想要得到的示例结果注意,map
返回一个数组;如果未使用该返回值,则不应使用map
;你应该使用一个普通的循环,或者forEach
。为什么从结果{id:1,value:-103}
,value
是负数,其余的不同?@NinaScholz,因为索引匹配(id),对于其他的,它只是-1*值