JS 手写之 Array.prototype.reduce
Array.prototype.reduce
reduce() 方法对数组中的每个元素执行一个由您提供的 reducer 函数(升序执行),将其结果汇总为单个返回值。
语法
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
参数
- callback - 执行数组中每个值 (如果没有提供 initialValue 则第一个值除外)的函数,包含四个参数:
- accumulator - callback 累计器累计回调的返回值; 它是上一次调用回调时返回的累积值,或 initialValue(见于下方)。
- element - callback 数组中当前正在处理的元素。
- index - 可选,数组中正在处理的当前元素的索引。 如果提供了 initialValue,则起始索引号为 0,否则从索引 1 起始。
- array - 可选,reduce 方法调用的数组
- initialValue - 可选,作为第一次调用 callback 函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。
返回值
函数累计处理的结果
Array.prototype.myReduce
Array.prototype.myReduce = function (callbackFn, initialValue) {
// 处理回调类型异常
if (Object.prototype.toString.call(callbackFn) != "[object Function]") {
throw new TypeError(callbackFn + " is not a function");
}
var acc = initialValue || this[0];
var startIndex = initialValue ? 0 : 1;
for (var i = startIndex, len = this.length; i < len; i++) {
acc = callbackFn(acc, this[i], i, this);
}
return acc;
};
测试
const arr = [1, 2, 3, 4];
arr.myReduce((total, cur) => total + cur); // 10
arr.myReduce((total, cur) => total + cur, 10); // 20
arr.myReduce("555"); // Uncaught TypeError: 555 is not a function