以此数组为例:
sudo
我需要得到它的结果:
[{id: 0, weight: 200}
{id: 0, weight: 200}
{id: 1, weight: 75}
{id: 2, weight: 5}]
答案 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));