學習一下Array.reduce函式的使用

飞向火星發表於2024-09-28

今天面試遇到一個問題,如下:

實現一個函式,把 [{ 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), [])

相關文章