【问题标题】:How to group array of objects to separate arrays by object value? [duplicate]如何将对象数组分组以按对象值分隔数组? [复制]
【发布时间】:2019-07-25 20:13:58
【问题描述】:

例子:

array  = [{name:'Anna'}, {name:'Bob'}, {name:'Joe'}, {name:'Anna'}]

我需要按名称对该数组进行分组以获得单独的数组,例如:

array 1 = [{name:'Anna'}, {name:'Anna'}]
array 2 = [{name:'Joe'}]
array 3 = [{name:'Bob'}]

不知道如何执行此操作。谢谢!

【问题讨论】:

  • 这是分组,不是排序
  • 那不是排序。那就是过滤。排序是指 1 个桶的所有内容。您想将 1 个存储桶的内容过滤到其他存储桶中。您需要开发一组与桶数相关的值。过滤器会运行很多次,但您可以创建一个更优化的解决方案,然后调用该命令 N 次
  • @hindmost,有点……
  • 更重要的是,您的尝试在哪里。你尝试了什么?

标签: javascript ecmascript-6


【解决方案1】:

我认为您的意思是按名称对项目进行分组,而不是对它们进行排序。

如果这是您想要的,您可以使用Array.reduce() 创建一个中间字典,其键是名称,值是分组所有具有相同名称的对象的数组。

然后使用Object.values()枚举这个字典并返回所有组:

const arr = [{name:'Anna', hello: 1}, {name:'Bob'}, {name:'Joe'}, {name:'Anna'}];

const result = Object.values(arr.reduce((acc, x) => {
  acc[x.name] = [...(acc[x.name] || []), x ];
  return acc;
}, {}));

console.log(result)

【讨论】:

  • 非常感谢。我开始自己做,但功能比你的要大得多。从你的例子中学到了很多,谢谢
【解决方案2】:

首先按name 对数组进行分组,然后获取对象值。为此,您可以使用Array.reduceObject.values

var array  = [{name:'Anna'}, {name:'Bob'}, {name:'Joe'}, {name:'Anna'}];

const res = array.reduce((acc, item) => {
   if (acc[item.name]) {
      acc[item.name] = [...acc[item.name], item];
   } else {
      acc[item.name] = [item];
   }
   return acc;
}, {});

console.log(Object.values(res));

【讨论】:

    【解决方案3】:

    只需使用reduce根据值转换为对象:

    const test = array.reduce((acc, el) => {
      if (!acc[el.name]) {
        return {
           ...acc,
           [el.name]: [el]
        }
      }
      return {
        ...acc,
        [el.name]: [...acc[el.name], el]
      }
    }, {});
    

    你有一个带有字段的对象,每个字段都包含请求的元素数组

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-30
      • 1970-01-01
      • 2021-03-29
      • 2022-01-24
      • 1970-01-01
      • 2021-11-19
      • 2018-05-01
      • 2021-10-14
      相关资源
      最近更新 更多