如何对数组中的重复对象进行分组

时间:2017-07-12 17:25:41

标签: javascript arrays duplicates

以此数组为例:

sudo

我需要得到它的结果:

 [{id: 0, weight: 200}
 {id: 0, weight: 200}
 {id: 1, weight: 75}
 {id: 2, weight: 5}]

3 个答案:

答案 0 :(得分:2)

您可以使用count

将数组缩减为新数组

var arr = [
    { id: 0, weight: 200 }, 
    { id: 0, weight: 200 }, 
    { id: 2, weight: 75  }, 
    { id: 9, weight: 5   }
];

var arr2 = arr.reduce( (a,b) => {
    var i = a.findIndex( x => x.id === b.id);
    return i === -1 ? a.push({ id : b.id, times : 1 }) : a[i].times++, a;
}, []);

console.log(arr2)

答案 1 :(得分:1)

var array= [
 {id: 0, weight: 200},
 {id: 0, weight: 200},
 {id: 1, weight: 75},
 {id: 2, weight: 5}];

console.log(array.reduce((function(hash){
return function(array,obj){
 if(!hash[obj.id])
  array.push(hash[obj.id]={id:obj.id,times:1});
 else
   hash[obj.id].times++;
  return array;
  };    
})({}),[]));

有关说明,请参阅Combine multiple arrays by same key,您可以在此处尝试:http://jsbin.com/licuwadifa/edit?console

答案 2 :(得分:1)

这个简单的化简器将返回一个数组数组,每个数组都包含原始数组中的所有重复元素。

function groupDuplicates(array, compareF) {
    return array.reduce((acc, item) => {
        const existingGroup = acc.find(g => (compareF(g[0], item)));
        if (existingGroup) {
            existingGroup.push(item);
        } else {
            acc.push([item])
        }
        return acc;
    }, []);
}

compareF 是您的自定义比较器,如果参数相等,则应返回true。

注意:在此实现中,非重复项将保留为其数组中的唯一元素。您可能希望稍后将其过滤掉,如下所示:

const duplicatesOnly = groupDuplicates(myArray, myComparator).filter(i => (i.length > 1));