在 javascript 中合并具有相同键的对象
Merge objects with same key in 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
}
您创建另一个对象,您可以在其中实际对项目进行分组并累积相应的小时数,就像这样
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
}
现在从 uniqueproject 映射中创建最终输出数组
newArray = Object.keys(uniqueproject).map(function(key){return {Project:key, Hours:uniqueproject[key]}});
thefourtheye
和 gurvinder372
提出的解决方案都有效,所以我在 jsPerf to test which is faster. You can see it here 上设置了基准测试。
看来 gurvinder372
的代码是迄今为止最快的。
P.S。请忽略 Uncaught TypeError
,因为这是一个 jsPerf 问题,目前正在修复,与测试结果无关。有关详细信息,请参阅 this and this。
我已经尝试解决这个问题很长时间了,如果我有一个像这样的对象数组:
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
}
现在从 uniqueproject 映射中创建最终输出数组
newArray = Object.keys(uniqueproject).map(function(key){return {Project:key, Hours:uniqueproject[key]}});
thefourtheye
和 gurvinder372
提出的解决方案都有效,所以我在 jsPerf to test which is faster. You can see it here 上设置了基准测试。
看来 gurvinder372
的代码是迄今为止最快的。
P.S。请忽略 Uncaught TypeError
,因为这是一个 jsPerf 问题,目前正在修复,与测试结果无关。有关详细信息,请参阅 this and this。