今天面試遇到一個問題,如下:
實現一個函式,把 [{ name: "Alice", age: 10 }, { name: "Bob", age: 20 }] 轉換成 { Alice: 10, Bob: 20 }
然後我用for迴圈加Object.values的方法實現了,面試這時候問,能不能用reduce實現?答,當然是可以的,可惜我對reduce使用的並不熟練,現在來學習一下。
下面是MDN給出的定義:
reduce方法對陣列中的每個元素按按順序執行一個提供的reducer函式,每一次執行reducer函式會將先前元素的計算結果作為引數傳入,最後將其結果彙總為單個元素返回。
它的第一個引數是一個函式,第二個引數是初始值。如果不傳入第二個引數,那麼陣列索引為0的元素將被作為初始值,迭代器將從第二個元素開始執行。
reducer可以理解為“歸約”:在電腦科學和程式設計中,特別是在函數語言程式設計裡,reducer 是一種特定型別的函式,它用於將集合中的元素透過某種操作累積起來得到一個單一的結果。這個過程通常稱為“歸約”(reduce)
下面是面試題的答案
function transformArrayToObject(arr) { return arr.reduce((accumulator, currentValue) => { // 使用當前元素的name作為鍵,age作為值新增到累加器物件中 accumulator[currentValue.name] = currentValue.age; return accumulator; }, {}); // 初始值為一個空物件 } // 測試資料 const array = [ { name: "Alice", age: 10 }, { name: "Bob", age: 20 } ]; // 呼叫函式並列印結果 const result = transformArrayToObject(array); console.log(result); // 輸出: { Alice: 10, Bob: 20 }
使用場景1:陣列求和
const array1 = [1, 2, 3, 4]; // 0 + 1 + 2 + 3 + 4 const initialValue = 0; const sumWithInitial = array1.reduce( (accumulator, currentValue) => accumulator + currentValue, initialValue, ); console.log(sumWithInitial); // Expected output: 10
使用場景2:展開巢狀陣列
const flattened = [[1, 2], [3, 4], [5, 6]].reduce((accumulator, currentValue) => accumulator.concat(currentValue), [])