Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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_Duplicates - Fatal编程技术网

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));