Stories

Detail Return Return

JavaScript 中的數組分組:array.groupBy() - Stories Detail

JavaScript 中的數組分組:array.groupBy()

原文: https://dmitripavlutin.com/ja...

由於豐富的標準實用程序庫,許多開發人員喜歡 Ruby 編程語言。例如,Ruby 中的數組有大量的方法。

JavaScript 也逐步豐富了其關於字符串和數組的標準庫。例如,在之前的文章中,我描述了新的array.at()方法。

今天的主角是新的數組組提案(目前處於第 3 階段),它引入了新的方法array.groupBy()array.groupByToMap(). 他們的polyfills在core-js庫中可用。

讓我們看看您如何從分組方法中受益。

1.array.groupBy ()

您有一個產品列表,其中每個產品都是一個具有 2 個屬性的對象:namecategory

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' }
  ]
};

你如何groupByCategory從數組中得到一個products數組?

通常的方法是array.reduce()使用正確的回調函數調用方法:

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

console.log(groupByCategory);
// {
//   'fruits': [
//     { name: 'apples', category: 'fruits' }, 
//     { name: 'oranges', category: 'fruits' },
//   ],
//   'vegetables': [
//     { name: 'potatoes', category: 'vegetables' }
//   ]
// }

products.reduce((acc, product) => { ... })products數組簡化為按類別分組的產品對象。

雖然我確實認為array.reduce()方法有用且強大,但有時它的可讀性並不是最好的。

因為對數據進行分組是一項經常發生的任務(GROUP BY從 SQL 中回憶起?),數組組提議引入了兩種有用的方法:array.groupBy()array.groupByToMap().

以下是array.groupBy()按類別創建相同分組的方法:

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

console.log(groupByCategory); 
// {
//   'fruits': [
//     { name: 'apples', category: 'fruits' }, 
//     { name: 'oranges', category: 'fruits' },
//   ],
//   'vegetables': [
//     { name: 'potatoes', category: 'vegetables' }
//   ]
// }

products.groupBy(product => {...}) 返回一個對象,其中每個屬性的鍵作為類別名稱,值作為包含相應類別產品的數組。

分組 usingproducts.groupBy()比 using 需要更少的代碼並且更容易理解product.reduce()

array.groupBy(callback)接受一個使用 3 個參數調用的回調函數:當前數組項、索引和數組本身。callback應該返回一個字符串:您要在其中添加項目的組名。

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

2.array.groupByToMap ()

有時您可能想要使用 Map而不是普通對象,因為Map是它接受任何數據類型作為鍵,但純對象僅限於字符串和符號。

因此,如果您想將數據分組到一個Map中,您可以使用該方法array.groupByToMap()

array.groupByToMap(callback)工作原理完全一樣array.groupBy(callback),只是它將項目分組為 Map而不是普通的 JavaScript 對象。

例如,按類別名稱將 products 數組分組到一個地圖中,執行如下:

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

console.log(groupByCategory); 
// Map([
//   ['fruits', [
//     { name: 'apples', category: 'fruits' }, 
//     { name: 'oranges', category: 'fruits' },
//   ]],
//   ['vegetables', [
//     { name: 'potatoes', category: 'vegetables' }
//   ]
// ])

三、結論

如果您想輕鬆地對數組中的項目進行分組(類似於GROUP BYSQL),那麼歡迎使用新方法array.groupBy()array.groupByToMap().

這兩個函數都接受一個回調,該回調應該返回必須插入當前項目的組的鍵。

array.groupBy()將項目組合成一個普通的 JavaScript 對象,同時array.groupByToMap()將它們組合成一個Map實例。

user avatar Leesz Avatar zaotalk Avatar nihaojob Avatar freeman_tian Avatar jingdongkeji Avatar kobe_fans_zxc Avatar dirackeeko Avatar razyliang Avatar longlong688 Avatar huajianketang Avatar inslog Avatar Dream-new Avatar
Favorites 141 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.