Javascript 将对象数组中包含相同id的对象获取到新数组中

Javascript 将对象数组中包含相同id的对象获取到新数组中,javascript,arrays,algorithm,duplicates,Javascript,Arrays,Algorithm,Duplicates,我想将具有相同id的所有对象放入一个新数组。 在下面的数据中,id为1的第一个对象在第三和第五位置重复,所以我需要将第一、第三和第五位置的对象存储到新数组中。如果在数据中重复了更多的id,情况也是如此 数据: 我的代码: // arr = data // headerKey = 'id' const getDuplicates = (arr, headerKey) => { return arr .map((el, i) => { return arr.fin

我想将具有相同id的所有对象放入一个新数组。 在下面的数据中,id为1的第一个对象在第三和第五位置重复,所以我需要将第一、第三和第五位置的对象存储到新数组中。如果在数据中重复了更多的
id
,情况也是如此

数据:

我的代码:

// arr = data
// headerKey = 'id'
const getDuplicates = (arr, headerKey) => {
  return arr
    .map((el, i) => {
      return arr.find((element, index) => {
        if (i !== index && element[headerKey] === el[headerKey]) {
          return el
        }
      })
    })
    .filter((x) => x)
}
我的输出不正确

[
  { id: 1, file: 'test2.xlsx' },
  { id: 1, file: 'test1.xlsx' },
  { id: 1, file: 'test1.xlsx' },
  { id: 9, file: 'test5.xlsx' },
  { id: 9, file: 'test4.xlsx' },
  { id: 9, file: 'test4.xlsx' }
]
预期产量

[
  { id: 1, file: 'test1.xlsx' },
  { id: 1, file: 'test2.xlsx' },
  { id: 1, file: 'test3.xlsx' },
  { id: 9, file: 'test4.xlsx' },
  { id: 9, file: 'test5.xlsx' },
  { id: 9, file: 'test6.xlsx' }
]
在具有
{id:1]的不正确的输出节对象中,文件:“test1.xlsx”}
被重复了2次,这不应该是这种情况,对于其他重复条目也是一样的

我想,我能够找出我当前的问题,以及输出不正确的原因可能是因为
find()
方法只返回第一个元素


我在网上搜索过解决方案,许多人建议使用reduce或filter方法,但我不知道如何实现它。

要降低计算复杂度,请不要
。在
中查找
。map
-这就是
O(n^2)
。我会计算一个给定的
id
在一个对象(或地图)上出现的次数,然后在最后,按集合过滤这些值,其中至少有2个值:

const数据=[
{id:1,文件:'test1.xlsx'},
{id:3,文件:'test1.xlsx'},
{id:1,文件:'test2.xlsx'},
{id:5,文件:'test2.xlsx'},
{id:1,文件:'test3.xlsx'},
{id:7,文件:'test3.xlsx'},
{id:8,文件:'test4.xlsx'},
{id:9,文件:'test4.xlsx'},
{id:9,文件:'test5.xlsx'},
{id:10,文件:'test5.xlsx'},
{id:9,文件:'test6.xlsx'},
]
//arr=数据
//headerKey='id'
const getDuplicates=(arr,headerKey)=>{
const objsByHeader={};
用于(arr的常量对象){
objsByHeader[obj[headerKey]]??=[];
objsByHeader[obj[headerKey]].push(obj);
}
返回Object.values(objsByHeader)
.filter(subar=>subar.length>=2)
.flat();
}

log(getDuplicates(数据'id'))
为了降低计算复杂度,不要
。在
地图中查找
。这就是
O(n^2)
。我会计算一个给定的
id
在一个对象(或地图)上出现的次数,然后在最后,按集合过滤这些值,其中至少有2个值:

const数据=[
{id:1,文件:'test1.xlsx'},
{id:3,文件:'test1.xlsx'},
{id:1,文件:'test2.xlsx'},
{id:5,文件:'test2.xlsx'},
{id:1,文件:'test3.xlsx'},
{id:7,文件:'test3.xlsx'},
{id:8,文件:'test4.xlsx'},
{id:9,文件:'test4.xlsx'},
{id:9,文件:'test5.xlsx'},
{id:10,文件:'test5.xlsx'},
{id:9,文件:'test6.xlsx'},
]
//arr=数据
//headerKey='id'
const getDuplicates=(arr,headerKey)=>{
const objsByHeader={};
用于(arr的常量对象){
objsByHeader[obj[headerKey]]??=[];
objsByHeader[obj[headerKey]].push(obj);
}
返回Object.values(objsByHeader)
.filter(subar=>subar.length>=2)
.flat();
}

log(getDuplicates(数据'id'))
我们可以通过使用,并最终检查累积数组的长度,以获得重复的
id
,以及如下所示的相应文件,来实现预期的输出

“代码>警察”常量数据=<代码>常量数据={{{{代码>宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏id:9,文件:'test6.xlsx'}]; 常量findDuplicates=(数据)=>{ 常量输出=[]; Object.values(data.reduce)(res,obj)=>{ 让key=obj.id; res[key]=[…(res[key]| |[]),{…obj}] 返回res; }.forEach(arr=>{ 如果(arr.length>1){ 输出。推送(…arr); } }); 返回输出; } console.log(findDuplicates(data))
。作为控制台包装器{
最大高度:100%!重要;

}
我们可以通过使用,并最终检查累积数组的长度,以获得重复的
id
,以及如下所示的相应文件,来实现预期的输出

“代码>警察”常量数据=<代码>常量数据={{{{代码>宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏宏id:9,文件:'test6.xlsx'}]; 常量findDuplicates=(数据)=>{ 常量输出=[]; Object.values(data.reduce)(res,obj)=>{ 让key=obj.id; res[key]=[…(res[key]| |[]),{…obj}] 返回res; }.forEach(arr=>{ 如果(arr.length>1){ 输出。推送(…arr); } }); 返回输出; } console.log(findDuplicates(data))
。作为控制台包装器{
最大高度:100%!重要;

}
index.js:51 objsByHeader[obj[headerKey]]??=[]^SyntaxError:Unexpected token'='我得到了这个错误,我想指出我使用的是nodejs,
??=
是,从nodejs
v15.0.0
开始兼容。@Pawankahere如果您不能使用
??=
,则可以执行
如果(!objsByHeader[obj[headerKey]])objsByHeader[obj[headerKey]]=[]
index.js:51 objsByHeader[headerKey]]??=[]^SyntaxError:意外标记“=”我收到此错误,我想指出我使用的是nodejs,
?=
是,它与nodejs
v15.0.0
以后的版本兼容。@PawanKanhere如果你不能使用
?=
,那么你可以做
如果(!objsByHeader[obj[headerKey]])objsByHeader[obj[headerKey]]=[]
[
  { id: 1, file: 'test1.xlsx' },
  { id: 1, file: 'test2.xlsx' },
  { id: 1, file: 'test3.xlsx' },
  { id: 9, file: 'test4.xlsx' },
  { id: 9, file: 'test5.xlsx' },
  { id: 9, file: 'test6.xlsx' }
]