我在比较一个键上的两个对象数组时遇到了麻烦。
我想比较,当键匹配时减去值,当不在我的目标数组中时显示负值。最后,我希望将所有目标对象(如果键不匹配)放入我的最终数组中。
举个例子可以节省 1000 字:
const initial = [{id: 1, value: 47}, {id: 2, value: 20}, {id: 7, value: 13}];
const target = [{id: 1, value: 150}, {id: 3, value: 70}, {id: 40, value: 477}];
//Desired output
// [{id: 1, value: 103}, {id: 2, value: -20}, {id: 7, value: -13}, {id: 3, value: 70}, {id: 40, value: 477}];
let comparator = [];
initial.map(initia => {
let hasSame = target.find(targ => {
return initia.id === targ.id
});
if(hasSame){
initia.value -= hasSame.value
} else{
initia.value = -initia.value
}
});
console.log(initial);
我几乎得到了我想要的结果,只是我不知道如何正确合并目标值。是否可以合并这些值而无需再次循环目标数组?或者我可以在 find
中执行此操作吗?
我想获得建议以尽可能干净地做到这一点
谢谢你!
最佳答案
您可以使用Map
并收集相同的 id
以及所需的求和因子。
结果将键/值作为新属性。
var add = (map, factor) => ({ id, value }) => map.set(id, map.has(id)
? map.get(id) - value * factor
: value * factor
),
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 }],
map = new Map,
result;
initial.forEach(add(map, -1));
target.forEach(add(map, 1));
result = Array.from(map, ([id, value]) => ({ id, value }));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
关于javascript - 比较两个 JavaScript 对象数组并合并数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61594893/