如何将对象数组分组以按对象值分隔数组?

时间:2019-03-04 13:43:20

标签: javascript ecmascript-6

示例:

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

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

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

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

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分: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 :(得分:0)

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

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

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