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

标签 javascript

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

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

举个例子可以节省 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/

相关文章:

javascript - 从下拉列表中删除多个重复选项

javascript - 如何自动解析 Sails.js 路由上的模型属性?

javascript - 更改 css 样式并使用 jQuery 附加文本

javascript - 使用 Rails 将数据填充到 Google map 上

javascript - JS 正则表达式到 Java,语法问题

javascript - 用 sinon stub 条纹 - 使用 stub.yields

javascript - 具有两个输入的表单未提交?

javascript - jQuery Datepicker UI 动画不工作

javascript - jquery ui datepicker setdate 仅适用于 google chrome

javascript - 如何知道在 vue/vue-router 中是否按下了后退/前进而不是手动路由器推送?