Javascript 如何将阵列中的重复对象分组
以该阵列为例:Javascript 如何将阵列中的重复对象分组,javascript,arrays,duplicates,Javascript,Arrays,Duplicates,以该阵列为例: [{id: 0, weight: 200} {id: 0, weight: 200} {id: 1, weight: 75} {id: 2, weight: 5}] 我需要得到以下结果: [ {id:0, times:2}, {id:1, times:1}, {id:2, times:1}] 您可以使用计数将数组减少为一个新数组 var-arr=[ {id:0,权重:200}, {id:0,权重:200}, {id:2,重量:75}, {id:9,重量
[{id: 0, weight: 200}
{id: 0, weight: 200}
{id: 1, weight: 75}
{id: 2, weight: 5}]
我需要得到以下结果:
[ {id:0, times:2},
{id:1, times:1},
{id:2, times:1}]
您可以使用计数将数组减少为一个新数组
var-arr=[
{id:0,权重:200},
{id:0,权重:200},
{id:2,重量:75},
{id:9,重量:5}
];
var arr2=arr.reduce((a,b)=>{
变量i=a.findIndex(x=>x.id==b.id);
返回i==-1?a.push({id:b.id,times:1}):a[i]。times++,a;
}, []);
console.log(arr2)
请参阅以获取解释,您可以在此处尝试:。这个简单的缩减器将返回一个数组数组,每个数组包含原始数组中的所有重复元素
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));
你能展示你尝试解决方案的代码吗?id的范围是否有限?可能是@Kadima的副本吗?不,id可以是random@NateAnderson我已经删除了代码,但我试图做的是在同一个数组中迭代数组的每个项,比较ID,并将结果对象推送到结果中数组。当你已经投票以副本形式关闭时,没有理由重新发布你的答案。@bergi这不是一个完全相同的副本,我认为OP可能无法为他的用例实现它。@Jonasw是的,我确实看到了你之前链接到的帖子,但我不知道如何实现它。非常感谢你!!你真是个救命恩人:)为什么是逗号运算符?它是一个返回语句,所以它在最后一个逗号之后返回任何内容。我知道。但是为什么不呢;返回a;那个在代码中插入iFIE来创建不必要的闭包的人说?无论如何,这只是一种习惯,在这种情况下,在返回之前也可以很容易地完成指派。@adaneo touché。
const duplicatesOnly = groupDuplicates(myArray, myComparator).filter(i => (i.length > 1));