函数特点:
- reduce()对于空数组是不会执行回调函数的
- 如果没有初始值,循环次数会比有初始值的多走一遍
函数用法:
Array.prototype.reduce((previousValue, currentValue, currntIndex, array) => {}, initialValue);
使用场景
[1, 2, 3, 4, 5].reduce((sum, cur) => {
return sum += cur;
}, 0);
[{num: 1}, {num: 2}, {num: 3}, {num: 4}, {num: 5}].reduce((sum, cur) => {
return sum += cur.num;
}, 0);
const ary = [1,2,3,4,5,2,6,6,2,1,3]
const obj = {}
ary.reduce((result, cur) => {
if (obj[cur]) {
return result
} else {
obj[cur] = true
result.push(cur)
return result
}
}, [])
const ary = [[1,2,3], 1, 2, 4, [5]];
ary.reduce((result, cur) => {
return result.concat(cur);
}, []); // [1, 2, 3, 1, 2, 4, 5]
const ary = [[0, 1], [2, 3], [4,[5,6,7]], 8];
const newAry = (ary) => {
return ary.reduce((res, cur) => {
return res.concat(Array.isArray(cur) ? newAry(cur) : cur);
}, []);
};
console.log(newAry(ary));
const ary = ['a', 'b', 'c', 'd', 'a', 'b']
ary.reduce((result, cur) => {
if (cur in result) {
result[cur] += 1
} else {
result[cur] = 1
}
return result
}, {})
[1,2,3,4,5].reduce((res, cur) => {
return res = res > cur ? res : cur
})
手写实现
Array.prototype.myReduce = function(fn, initialValue) {
let ary = Array.prototype.slice.call(this)
if (ary.length === 0) throw new TypeError('Reduce of empty array with no initial value')
let result = initialValue
for (let i = 0
if (result === undefined && i === 0) {
result = ary[0]
continue
}
result = fn.call(null, result, ary[i], i, this)
}
return result
}