--- title: reduce tags: reduce, description: --- reduce === :::success **reduce()** 將一個**累加器(accumulator)** 及**陣列中每項元素 (currentValue)** 傳入**回呼函式(callback function)**,將陣列化為單一值。 ::: ```javascript= arr.reduce(function(accumulator, currentValue, currentIndex, array), initialValue) ``` - **accumulator**: 累積回傳值的累加器,會傳入**前一次**的累加值。 - **currentValue**:當前陣列元素item。 - **currentIndex**:當前陣列索引index。 - **array**:當前陣列。 - **initialValue**:累加器初始值。不代入初始值會以陣列第一個item代入。 **currentIndex**、**array**、**initialValue**視狀況選擇性代入。 <br> ### reduce的用法 - **陣列數字累加** 把陣列內的數字累加並回傳,累加器初始值不代入,從100開始累加,最後將1500賦予給變數sum。 ```javascript= const num = [100, 200, 300, 400, 500]; let sum = num.reduce((acc, cur) => acc += cur); console.log(sum); ``` <br> - **字串Unicode值累加** `a = 1`、`b = 2`......`z = 26`,將字串文字 **(限小寫)** 依此順序轉換數字後累加。 - `[...str]`先將字串拆成陣列。 - 累加器代入初始值0,當前item`.charCodeAt(0)`取第一個字元轉換成`Unicode`,減96的原因是a的`Unicode`是97。 - 第一次`0 + cur.charCodeAt(0) - 96`,第二次`前一次累加 + cur.charCodeAt(0) - 96`,全部執行完後`return`回傳。 ```javascript= function wordsToMarks(str) { return [...str].reduce((acc, cur) => acc + cur.charCodeAt(0) - 96, 0); }; console.log(wordsToMarks('abcd')); // 10 ``` <br> - **帳戶資訊計算** 小明有固定存錢的好習慣,以下是小明的銀行帳戶資訊。 1. 請協助他將存款資訊 mingTransfer 的內容合併到 mingAccount.depositRecord 陣列中(使用 `.push()`)。 2. 請將他各月的存款累加到 mingAccount.deposit 中(可以使用 `forEach()` 或 `reduce()`) 參考: https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce ```javascript= // 小明的銀行帳戶資訊 let mingAccount = { name: '小明', age: 22, deposit: 10000, depositRecord: [ { title: '開戶', amounts: 10000 } ] }; // 小明的存款資訊 let mingTransfer = [ { title: '一月存款', amounts: 777 }, { title: '二月存款', amounts: 7000 }, { title: '三月存款', amounts: 70000 } ] console.log(mingAccount); ``` 解法: ```javascript= // 小明的銀行帳戶資訊 let mingAccount = { name: '小明', age: 22, deposit: 10000, depositRecord: [ { title: '開戶', amounts: 10000 } ] }; // 小明的存款資訊 let mingTransfer = [ { title: '一月存款', amounts: 777 }, { title: '二月存款', amounts: 7000 }, { title: '三月存款', amounts: 70000 } ]; // 存款資訊push到mingAccount.depositRecord for (const item of mingTransfer) { mingAccount.depositRecord.push(item); }; // mingTransfer使用reduce計算加總,初值代入mingAccount.deposit mingAccount.deposit = mingTransfer.reduce((acc, item) => acc + item.amounts, mingAccount.deposit); console.log(mingAccount); ```