在JavaScript数组中合并重复项
我有一个愚蠢的问题,一开始似乎很容易解决,但结果却很棘手 我有一个对象数组,每个对象有两个属性:id和value:在JavaScript数组中合并重复项,javascript,arrays,Javascript,Arrays,我有一个愚蠢的问题,一开始似乎很容易解决,但结果却很棘手 我有一个对象数组,每个对象有两个属性:id和value: [ {id: 2, value: 10}, {id: 4, value: 3}, {id: 2, value: 2}, {id: 1, value: 15} ] 我想写一个算法,将具有相似id的值相加。 我的最终结果应该是一个只包含合并对象的新数组: [ {id: 2, value: 12}, {id: 4, value: 3}, {id: 1
[
{id: 2, value: 10},
{id: 4, value: 3},
{id: 2, value: 2},
{id: 1, value: 15}
]
我想写一个算法,将具有相似id的值相加。
我的最终结果应该是一个只包含合并对象的新数组:
[
{id: 2, value: 12},
{id: 4, value: 3},
{id: 1, value: 15}
]
我尝试了以下方法,但无效:
var arr = [];
arr.push({id: 2, visit:10});
arr.push({id: 4, visit:3});
arr.push({id: 2, visit:2});
arr.push({id: 1, visit:15});
// Deep copy
var copy = jQuery.extend(true, [], arr);
var masterArr = [];
for (var i = 0; i < arr.length; i++) {
var objArr = [];
objArr.push(arr[i]);
for (var j = copy.length-1; j > -1; j--) {
if (arr[i].id === copy[j].id) {
var q = copy.splice(j,1);
}
}
masterArr.push(objArr);
}
var arr=[];
arr.push({id:2,访问:10});
arr.push({id:4,访问:3});
arr.push({id:2,访问:2});
arr.push({id:1,访问:15});
//深度复制
var copy=jQuery.extend(true,[],arr);
var masterArr=[];
对于(变量i=0;i-1;j--){
if(arr[i].id==copy[j].id){
var q=复制拼接(j,1);
}
}
主减速器推力(objArr);
}
我的计划是首先将所有相似的对象收集在单独的数组(objArr)中,将它们汇总并放入最终数组(masterArr)。我使用jQuerysExtend制作一个深度副本(而不是引用),并反向迭代和拼接以删除已经被发现为“副本”的对象
这不行!而且这似乎不是一个非常有效的方法来解决我的问题。
我怎么能这样做?性能不是最重要的,而是“很好拥有”
谢谢
// First group the data based on id and sum the values
var temp = data.reduce(function(result, current) {
result[current.id] = (result[current.id] || 0) + current.value;
return result;
}, {});
// then recreate the objects with proper id and value properties
var result = [];
for (var key in temp) {
result.push({
id: parseInt(key, 10),
value: temp[key]
});
}
console.log(result);
输出
[ { id: 1, value: 15 },
{ id: 2, value: 12 },
{ id: 4, value: 3 } ]
您可以这样做:
// Assuming:
a = [{id: 2, value: 10}, {id: 4, value: 3}, {id: 2, value: 2}, {id: 1, value: 15}]
var b = {}, // Temporary variable;
c = []; // This will contain the result;
// Build a id:value object ( {1: 15, 2: 12, 4: 3} )
a.map(function(current){b[current.id] = (b[current.id] || 0) + current.value});
for(var key in b){ // Form that into the desired output format.
c.push({id: parseInt(key, 10), value: b[key]});
}
console.log(c);
/* [{id: 1, value: 15},
{id: 2, value: 12},
{id: 4, value: 3}] */
我使用的是
parseInt(key,10)
,因为键是字符串,所以您可能希望它们再次转换为整数。最快的方法是使用array.prototype.filter()
在数组上循环一次:
它还重用对象,尽管这会使原始数组包含不准确的值。如果这是一个问题,您可以修改示例,将每个对象属性复制到一个新对象。Olefrank,我们的答案对您有帮助吗?
var tmp = {},
result = arr.filter(function (el) {
if (tmp.hasOwnProperty(el.id)) {
tmp[el.id].visit += el.visit;
return false;
}
else {
tmp[el.id] = el;
return true;
}
});