Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript数组中合并重复项_Javascript_Arrays - Fatal编程技术网

在JavaScript数组中合并重复项

在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和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, 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;
        }
    });