天天看点

#yyds干货盘点#array.groupBy()

array.groupBy()

假设我们有一个产品列表,其中每个产品都是一个具有2个属性的对象: ​

​name​

​ 和 ​

​category​

​。

const products = [
  { name: 'apples', category: 'fruits' },
  { name: 'oranges', category: 'fruits' },
  { name: 'potatoes', category: 'vegetables' }
];      

在上面的示例中,​

​products​

​ 是一个产品对象数组。

​现在,对产品列表执行一个简单的操作,将产品按类别分组。

const groupByCategory = {
  'fruits': [
    { name: 'apples', category: 'fruits' }, 
    { name: 'oranges', category: 'fruits' },
  ],
  'vegetables': [
    { name: 'potatoes', category: 'vegetables' }
  ]
};      

如何从 ​

​products​

​​ 数组中得到一个类似 ​

​groupByCategory​

​ 的数组?

通常的方法是使用​

​array.reduce()​

​来实现,如下所示:

const groupByCategory = products.reduce((group, product) => {
  const { category } = product;
  group[category] = group[category] ?? [];
  group[category].push(product);
  return group;
}, {});
console.log(groupByCategory);      

​products.reduce((acc, product) => { ... })​

​ 将产品数组还原为一个按类别分组的产品对象。

​array.reduce()​

​方法有用且强大,但有时它的可读性并不是最好的。

因为分组数据是常见的事(从SQL中召回groupby ?),数组组提案引入了两个有用的方法:​

​array. groupBy()​

​和 ​

​array.groupByToMap()​

​。

下面介绍如何使用 ​

​array.groupBy()​

​ 创建相同的分类分组:

const groupByCategory = products.groupBy(product => {
  return product.category;
});

console.log(groupByCategory);       
const groupedObject = array.groupBy((item, index, array) => {
  // ...
  return groupNameAsString;
});