[Medium] LeetCode JS 30 - 2631. Group By (陣列分組)

2024年3月7日

💎 加入 E+ 成長計畫 與超過 400+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源

LeetCode 30 Days of JavaScript

本題來自 LeetCode 的 30 天 JacaScript 挑戰

2631. Group By (陣列分組)

題目描述

請實踐一個陣列操作的方法 groupBy,該方法會讓任何陣列呼叫 array.groupBy(fn) 時,獲得該陣列分組後的結果。

所謂的陣列分組**,**是指陣列中的每個鍵都是 fn(arr[i]) 的輸出,輸出的陣列中,含有原始陣列中具有該鍵的所有項。

提供的回呼函式 fn 會接受陣列中的項目並傳回一個字串類型的鍵。每個值陣列的順序,會與陣列中元素出現的順序相同。任何順序的鍵都是可以接受的。

具體如下範例,輸入一個有物件的陣列,並且回呼函式是以 item.id 作為判斷,所以呼叫完 groupBy(fn) 後,會把 id 做為鍵,而有該 id 的物件,都會被放到同個陣列做為值,例如有 {"id":"1"} 的會被放在同個陣列。

// 範例
輸入:
[
  {"id":"1"},
  {"id":"1"},
  {"id": 2},
],
fn = function (item) {
  return item.id;
}

輸出:
{
  "1": [{"id": "1"}, {"id": "1"}],
2”:[{“id”:“2}]
}

解釋:
輸出來自函式 array.groupBy(fn)
分組方法是從陣列中的每個項目中取得 "id"
有兩個 "id"1 的物件。所以將這兩個物件都放在第一個陣列中。
有一個 "id"2 的物件。所以該物件被放到第二個陣列中。

本題解答

以下是本題的解答,詳細解題思路可以在 E+ 成長計畫看到。如果想練習更多題目,推薦可以到 GreatFrontEnd 上練習

解法

Array.prototype.groupBy = function (fn) {
  const grouped = {};

  this.forEach((item) => {
    const key = fn(item);
    if (!grouped[key]) {
      grouped[key] = [];
    }
    grouped[key].push(item);
  });
  return grouped;
};
🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們