Loading

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
posted @ 2021-05-25 00:25  Frank-Link  阅读(391)  评论(0编辑  收藏  举报