在 javascript 中合并具有相同键的对象

Merge objects with same key in javascript

本文关键字:对象 javascript 合并      更新时间:2023-09-26

如果我有这样的对象数组,我一直在尝试解决这个问题:

var my_array = [
    Object {Project: A, Hours: 2},
    Object {Project: B, Hours: 3},
    Object {Project: C, Hours: 5},
    Object {Project: A, Hours: 6},
    Object {Project: C, Hours: 9}
]

我想将所有具有相同键的对象合并到一个对象中,以便将它们的小时数相加:

预期产出:

my_array = [
    Object {Project: A, Hours: 8}
    Object {Project: B, Hours: 3}
    Object {Project: C, Hours: 14}
]

我该如何处理这个问题?我花了很长时间才以这种方式格式化数据,这是最后一步!

我的尝试,我得到我正在循环数组,不确定如何处理对象的合并:

for (var i =0; i<my_array.length; i++) {
   my_array[i].Project   // access the object project key
   my_array[i].Hours     // need to increment hours
}

您创建另一个对象,您可以在其中实际对项目进行分组并累积相应的小时数,如下所示

var groups = my_array.reduce(function(resultObject, currentObject) {
    // if this is the first time the project appears in the array, use zero as the
    // default hours
    resultObject[currentObject.Project] = resultObject[currentObject.Project] || 0;
    // add the current hours corresponding to the project
    resultObject[currentObject.Project] += currentObject.Hours;
    return resultObject;
}, {});

此时,您的groups将如下所示

console.log(groups);
// { A: 8, B: 3, C: 14 }

现在,你只需要展开这个对象,就像这样

var result = Object.keys(groups).map(function(currentGroup) {
    return {Project: currentGroup, Hours: groups[currentGroup]};
});

现在,结果将是

[ { Project: 'A', Hours: 8 },
  { Project: 'B', Hours: 3 },
  { Project: 'C', Hours: 14 } ]

在您的尝试中,您错过了创建新数组的机会

var newArray = [];
var uniqueprojects = {};
for (var i =0; i<my_array.length; i++) {
   if ( !uniqueproject[my_array[i].Project] )
   {
     uniqueproject[my_array[i].Project] = 0;
   }
   uniqueproject[my_array[i].Project] += my_array[i].Hours;
   //my_array[i].Project   // access the object project key
   //my_array[i].Hours     // need to increment hours
}

现在从唯一的项目映射中创建最终输出数组

newArray = Object.keys(uniqueproject).map(function(key){return {Project:key, Hours:uniqueproject[key]}});

thefourtheyegurvinder372 提出的解决方案都有效,所以我在 jsPerf 上设置了一个基准测试来测试哪个更快。你可以在这里看到它。

看来gurvinder372的代码是迄今为止最快的。

附言请忽略Uncaught TypeError,因为它是目前正在修复的 jsPerf 问题,与测试结果无关。有关详细信息,请参阅此和此内容。