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

4

我将尽力为您翻译,以下是需要翻译的内容:

我已经试图弄清楚这个问题很长时间了。如果我有一个如下所示的对象数组:

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
}
3个回答

7
你可以创建另一个对象来分组项目并累加相应的工时,像这样:

您可以创建另一个对象,在其中实际分组项目并累加相应的工时,就像这样:

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 } ]

2
在您的尝试中,您忽略了创建一个新数组。
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
}

现在,根据uniqueproject map创建最终输出数组。
newArray = Object.keys(uniqueproject).map(function(key){return {Project:key, Hours:uniqueproject[key]}});

我刚在jsPerf上测试了你的代码,并将其与其他提出的解决方案进行了比较,发现你的代码要快得多。请看下面我的帖子。 - Miqi180

2

两种方案都可行,thefourtheyegurvinder372都提出了解决方案,因此我在jsPerf上建立了一个基准测试来测试哪个更快。你可以在这里看到。

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

P.S. 请忽略Uncaught TypeError,因为这是一个jsPerf问题,目前正在修复中,与测试结果无关。欲了解更多信息,请参见这里这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接