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