首页 > 解决方案 > 基于对象数组中的条件的俱乐部对象

问题描述

我有一个这样的对象数组

const obj = [
  {
    id: 1,
    name: "Abc"
  },
  {
    id: 2,
    name: "BED"
  },
  {
    id: 1,
    name: "FGH"
  },
  {
    id: 3,
    name: "RFS"
  },
  {
    id: 1,
    name: "Abc"
  },
  {
    id: 2,
    name: "BGH"
  }
]

我想将具有相同 id 和相同名称的对象组合在一起,以便我的最终输出看起来像这样-

const result = [
  [
    {
      id: 1,
      name: "Abc"
    },
    {
      id: 1,
      name: "Abc"
    }
  ],
  [
    {
      id: 1,
      name: "TSD"
    }
  ],
  [
    {
      id: 2,
      name: "BED"
    }       
  ],
  [
      {
      id: 2,
      name: "BGH"
    }
  ],
  [
    {
      id: 3,
      name: "RFS"
    }
  ]
]

注意 - 我在数组中有大约 300-400 个对象,我使用嵌套的 For 循环来解决这个问题。因此,我正在寻找更好更快的解决方案

标签: javascript

解决方案


您可以使用reduce()和使用对象累加器。最后用于Object.values获取数组。

const obj = [ { id: 1, name: "Abc" }, { id: 2, name: "BED" }, { id: 1, name: "FGH" }, { id: 3, name: "RFS" }, { id: 1, name: "TSD" }, { id: 2, name: "BGH" } ]

let res = Object.values(obj.reduce((ac,a) => {
  if(!ac[a.id]) ac[a.id] = [];
  ac[a.id].push(a);
  return ac;
},{}))

console.log(res)

使用for...of

const obj = [ { id: 1, name: "Abc" }, { id: 2, name: "BED" }, { id: 1, name: "FGH" }, { id: 3, name: "RFS" }, { id: 1, name: "TSD" }, { id: 2, name: "BGH" } ]

let res = {};

for(let item of obj){
  if(!res[item.id]) res[item.id] = [];
  res[item.id].push(item);
}

console.log(Object.values(res))


推荐阅读