首页 > 解决方案 > 如何使用 javascript 对重复对象的 ID 进行分组并删除数组中的对象

问题描述

我想在从匹配的(已经存在的)对象 id 分组重复的对象 id 后从数组中删除重复的对象。无论我尝试过什么,都是对 ID 进行分组,但没有得到如何从数组中删除重复对象。

原始数组

        [
         {id:2,title:'men'},
         {id:3,title:'women'},
         {id:1,title:'kids'},
         {id:4,title:'sports'}, 
         {id:5, title:'women'},
         {id:6,title:'kids'}
       ];

预期数组

 [
   { id: 2, title: 'men' },
   { id: [3,5], title: 'women' },
   { id: [1,6], title: 'kids' },
   { id: 4, title: 'sports' }
 ]

试过了

let array = [{id:2,title:'men'},{id:3,title:'women'},{id:1,title:'kids'},
{id:4,title:'sports'}, {id:5, title:'women'},{id:6,title:'kids'}];

for(let i=0; i<array.length-1;i++){
    for(let j=i+1; j<array.length; j++){
        if(array[i].title===array[j].title)
         array[i]={id:[array[i].id, array[j].id], title: array[i].title}
    }
}
console.log(array)

请帮助以更好的方式达到预期的结果。

标签: javascriptarraysecmascript-6

解决方案


首先{ [title]: keys[] }使用创建反向对象reduce然后将其映射回您需要的对象更容易array

const input = [
  { id: 2, title: "men" },
  { id: 3, title: "women" },
  { id: 1, title: "kids" },
  { id: 4, title: "sports" },
  { id: 5, title: "women" },
  { id: 6, title: "kids" },
];

const output = input.reduce((acc, { id, title }) => {
  const val = acc[title];
  if (val) {
    acc[title] = Array.isArray(val) ? [...val, id] : [val, id];
  } else {
    acc[title] = id;
  }
  return acc;
}, {});

const result = Object.keys(output).map((key) => ({
  id: output[key],
  title: key,
}));

console.log(result);


推荐阅读