[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;
};