Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较两个javascript对象数组并合并数据_Javascript - Fatal编程技术网

比较两个javascript对象数组并合并数据

比较两个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

我在比较一个键上的两个对象数组时遇到了麻烦

我想比较,在键匹配时减去值,在不在目标数组中时显示负值。最后,我希望所有的目标对象(如果关键点不匹配)都在我的最终数组中

一个示例可以节省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,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*值