2016-03-22 60 views
4

我一直在试图弄清楚这一点,很长一段时间,如果我有对象的这样一个数组:合并使用相同的密钥JavaScript中的对象

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 
} 

回答

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 
} 

现在创建出最终的输出数组out of uniqueproject map

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

仅供参考我只是在jsPerf上测试了您的代码,并将它与其他建议的解决方案进行了比较,您的代码更快。看到我的帖子下面。 – Miqi180

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

两个thefourtheye的和gurvinder372的提出了解决办法工作,所以我成立了一个基准测试上jsPerf测试速度更快。你可以看到它here

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

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

相关问题