首页 > 解决方案 > 在对象数组中按公共属性分组项目

问题描述

我有两个大数组,一个是项目,另一个是拥有这些项目的名称。我需要将所有具有匹配项的名称推送到 array2 项中。

我可以通过嵌套 forEach 循环来做到这一点:

array1 = [
  {item: "1", name: "Joe" },
  {item: "2", name: "Sam" },
  {item: "1", name: "Alice"},
  {item: "3", name: "Peter"},
  {item: "1", name: "Jack"},
]

array2 = [
  { item: "1", names: []},
  { item: "2", names: []},
  { item: "3", names: []},
]

array2.forEach(x => {
    array1.forEach(y => {
        if( x.item === y.item ){
        x.names.push(y.name)
        }
    })
})
console.log(array2)

但我有一种感觉,这是一种不好的做法,更不用说大型阵列上的资源繁重了。

这样做的现代方法是什么?

标签: javascripthtmlforeach

解决方案


我相信,您最好利用以下优势Map

const src = [
        {item: "1", name: "Joe" },
        {item: "2", name: "Sam" },
        {item: "1", name: "Alice"},
        {item: "3", name: "Peter"},
        {item: "1", name: "Jack"},
      ],
      
      result = [...src
        .reduce((acc, {item,name}) => {
          const group = acc.get(item)
          group
            ? group.names.push(name)
            : acc.set(item, {item, names:[name]})
          return acc
        }, new Map)
        .values()
      ]
      
console.log(result)      


推荐阅读