---
# System prepended metadata

title: Array.reduce() 左至右歸約

---

# Array.reduce() 左至右歸約

`array.reduce(callback(accumulator, currentValue, currentIndex, array), initialValue)`
將陣列中的每一個元素依序傳入一個[回調函式](/_euUA6bnRwOjECFZalEn3w)，將數組中的每個元素組合成一個單一的值。

__accumulator__ 累加器，保存了上一次回調函式返回的值，或是初始值（如果提供了初始值）。
__currentValue__ 當前處理的陣列元素的值。
__currentIndex__（可選） 當前處理的陣列元素的索引。
__array__（可選） 原始陣列。
__initialValue__（可選）
初始值，如果提供了初始值，它將作為第一次調用回調函式時的 accumulator 的初始值。如果未提供初始值，則將使用陣列的最後一個元素作為初始值，並從倒數第二個元素開始遍歷。


## 使用方法
計算訂單中所有商品的總金額
```
const order = [
  { product: '手机', price: 599 },
  { product: '平板电脑', price: 299 },
  { product: '耳机', price: 49 },
  { product: '充电器', price: 19 },
];

const totalPrice = order.reduce((accumulator, currentItem) => {
  return accumulator + currentItem.price;
}, 0);

console.log('订单总额：', totalPrice); //订单总额： 966

```


## 簡化原理
### Leetcode 2626
Array Reduce Transformation
```
const reduce = (nums, fn, init) => {
   if (nums.length == 0) {return init;};
   let val = init;

   for (let i = 0; i < nums.length; i++) {
      val = fn(val, nums[i]);
   }

   return val;
}
```

Testcase
```
let nums = [1,2,3,4];
function sum(accum, curr) { return accum + curr; }
let init = 0;
console.log(reduce(nums,sum,init));
```

使用 Array.reduce()
```
let nums = [1,2,3,4];
let val = nums.reduce((accum, curr)=>(accum+curr),0);
console.log(val);
```

## 相關練習
### LeetCode 2695
Array Wrapper

創建一個類“ArrayWrapper”，在其構造函數中接受整數數組。 這個類應該有兩個特點:      
Create a class `ArrayWrapper` that accepts an array of integers in its constructor. This class should have two features:

- 當使用“+”運算符將此類的兩個實例相加時，結果值是兩個數組中所有元素的總和。      
When two instances of this class are added together with the `+` operator, the resulting value is the sum of all the elements in both arrays.

- 當在實例上調用“String()”函數時，它將返回一個用括號括起來的逗號分隔字符串。 例如，“[1,2,3]”。     
When the `String()` function is called on the instance, it will return a comma separated string surrounded by brackets. For example, `[1,2,3]`.

#### 解決方案

- valueOf()
   - 使用Array.flat(1); 將多維陣列平坦化為一維陣列
   - 使用Array.reduce(); 相加所有元素
- toString()
   - 使用Array.join(,) 把所有的元素中間用,隔開並組合成字串 

```javascript
class ArrayWrapper {
    //this.nums=[[1,2],[3,4]]
    constructor(nums) {
      this.nums = nums;
    }

    valueOf() {
        const flattenArray = this.nums.flat(1);
        return flattenArray.reduce((sum, num) => sum + num, 0);
    }

    toString() {
      return `[${this.nums.join(',')}]`;
    }
}
```
