### 署名

reduce() 函式接受 2 個參數（M：強制的，O：可選的）：

• (M) 一個 callback reducer 函式 可以處理先前的計算結果，到下一個元素直到最後。
• (O) 一個初始值可以被當作第一個呼叫 callback 的第一個參數。

### 普遍用法（累加、關聯）

``````// 我目前在 amazon 購買的 caddy
var items = [{price: 10}, {price: 120}, {price: 1000}];

// 我們的 reducer 函式
var reducer = function add(sumSoFar, item) { return sumSoFar + item.price; };

// 計算結果
var total = items.reduce(reducer, 0);

console.log(total); // 1130
``````

``````var total = items.reduce(reducer, -20);

console.log(total); // 1110
``````

### 進階用法（組合）

``````var reducers = {
totalInDollar: function(state, item) {
// 具體宣告...
return state.dollars += item.price;
},
totalInEuros : function(state, item) {
state.euros += item.price * 0.897424392;
return state;
},
totalInPounds : function(state, item) {
state.pounds += item.price * 0.692688671;
return state;
},
totalInYen : function(state, item) {
state.yens += item.price * 113.852;
return state;
}
// 更多...
};
``````

• 負責應用每個部分的 reduce 函式。
• 回傳一個新的 callback reducer 函式。
``````var combineTotalPriceReducers = function(reducers) {
return function(state, item) {
return Object.keys(reducers).reduce(
function(nextState, key) {
reducers[key](state, item);
return state;
},
{}
);
}
};
``````

``````var bigTotalPriceReducer = combineTotalPriceReducers(reducers);

var initialState = {dollars: 0, euros:0, yens: 0, pounds: 0};

var totals = items.reduce(bigTotalPriceReducer, initialState);

console.log(totals);

/*
Object {dollars: 1130, euros: 1015.11531904, yens: 127524.24, pounds: 785.81131152}
*/
``````