基于一个唯一的 属性 对对象数组进行分组?

Group array of object base on one unique property?

例如,如何将如下所示的对象数组转换为名称按id分组的相应结果?我想使用 vanilla Javascript 并且尽可能不使用像 lodash 这样的外部库来做到这一点。

示例数组:

const items = [
    { id: 1, name: 'a' },
    { id: 2, name: 'b' },
    { id: 3, name: 'c' },
    { id: 1, name: 'd' },
    { id: 3, name: 'f' },
    { id: 1, name: 'a' },
    { id: 3, name: 'c' },
  ];

预期结果:

 const result = [
   { id: 1, names: ['a', 'd']},
   { id: 2, names: ['b']},
   { id: 3, names: ['c', 'f']}
  ] 

我在数组上执行 reduce,它给了我一个

形式的对象
{
  1: [object Set] { ... },
  2: [object Set] { ... },
  3: [object Set] { ... }
}

其中 Set 仅用于保留唯一值。

之后,我 运行 map Object.entries 将数据转换为您想要的格式。

const items = [{ id: 1, name: 'a' },{ id: 2, name: 'b' },{ id: 3, name: 'c' },{ id: 1, name: 'd' },{ id: 3, name: 'f' },{ id: 1, name: 'a' },{ id: 3, name: 'c' },];
  
  const a = items.reduce((acc,curr)=> {
    if(!acc[curr.id]){
        acc[curr.id] = new Set();
    }
    
    acc[curr.id].add(curr.name)
   
    return acc;
  },{})
  
  let result = Object.entries(a).map((el) => ({id: el[0],names:[...el[1]]}))
  
  console.log(result)
.as-console-wrapper { max-height: 100% !important; top: 0; }