Array.prototype.reduce((total, curVal, curIdx, arr) => {}, initVal)
reduce() 方法接收一个函数作为累加器,数组中的每个值 (从左到右)开始缩减,最终为一个值,是ES5中新增的又一个数组逐项处理方法
参数:
原方法
1 2
| var arr = [1, 2, 3, 4] arr.reduce((a, b) => a + b, 10)
|
手写 __reduce
1 2 3 4 5 6 7 8 9 10 11 12 13
| Array.prototype.__reduce = function (fn, initVal) { const arr = this let total = initVal || arr[0]
for (let i = (initVal ? 0 : 1); i < arr.length; i++) { total = fn(total, arr[i], i, arr) } return total }
const arr = [1, 2, 3, 4] console.log(arr.__reduce((a, b) => a + b)) console.log(arr.__reduce((a, b) => a + b, 100))
|
reduce 的其他用法
去重
1 2 3 4 5 6 7 8 9 10
| const arr = ['a', 'b', 'c', 'a', 'd', 'e', 'r', 'a']
const newArr = arr.reduce((total, curVal) => { if (!total.includes(curVal)) { total.push(curVal) } return total }, [])
console.log(newArr)
|
数组打平
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| const arr = [[1,2], 3, [4,5], [6, [7, 8, 9]]]
const foo = function (arr) { return arr.reduce((total, curVal) => { total = total.concat(curVal instanceof Array ? foo(curVal) : curVal) return total }, []) }
console.log(foo(arr))
|
数组中重复最多的值
1 2 3 4 5 6 7 8
| const arr = ['a','b','c','a','d','e','r','a']
const res = arr.reduce((total, curVal) => { total[curVal]++ || (total[curVal] = 1) return total }, {})
console.log(res)
|
最大值最小值
1 2 3 4 5
| const arr = [1, 2, 3, 4, 15, 6, 7, 8, 9]
const res = arr.reduce((a, b) => Math.max(a, b))
console.log(res)
|