从头开始实现reduce(),不知道JS如何知道“数组”是什么

tki*_*m90 3 javascript reduce

我正在尝试从头开始实现reduce()。我能够让它工作,但是即使我从未在任何地方定义过它,javascript如何知道“数组”是什么?

function reduce(callback, initialVal) {
  var accumulator = (initialVal === undefined) ? undefined : initialVal;
  for (var i=0; i<array.length; i++) {
    if (accumulator !== undefined) {
      accumulator = callback(accumulator, array[i], i, array);
    } else {
      accumulator = array[i]
    }
  }
  return accumulator;
};

// testing a basic sum
arr = [1,2,3]
arr.reduce( (accumulator, elem) => accumulator+=elem )
Run Code Online (Sandbox Code Playgroud)

编辑:我开始工作了:DI 将“array”更改为“this”,因为我在 Array.prototype 下创建了一个新方法。

Array.prototype.myReduce = function(callback, initialVal) {
  var accumulator = (initialVal !== undefined) ? initialVal : undefined;
  for (var i=0; i<this.length; i++) {
    if (accumulator !== undefined) {
      accumulator = callback(accumulator, this[i], i, this);
    } else {
      accumulator = this[i]
    }
  }
  return accumulator;
};

arr.myReduce( (accumulator, elem) => accumulator+=elem )
arr.myReduce( (accumulator, elem) => accumulator+=elem , 100)
Run Code Online (Sandbox Code Playgroud)

Mar*_*yer 15

你很接近。似乎缺少的一个见解是,在函数内部,this将被定义为调用函数的数组。因此,您可以this在当前使用的地方使用array,这在您的函数中将是未定义的(正如您所怀疑的)。您可能还想在不同的位置启动循环,具体取决于是否传入初始值。例如:

function reduce(callback, initialVal) {
    var accumulator = ( initialVal === undefined) ? this[0] : initialVal;
    var start = (initialVal === undefined) ? 1 : 0
    for (var i = start; i < this.length; i++) {
        accumulator = callback(accumulator, this[i])
    }
    return accumulator;
  };

Array.prototype.myReduce = reduce

// no init value
console.log([1, 2, 3].myReduce((sum, curr) => sum + curr))

// init value:
console.log([1, 2, 3].myReduce((sum, curr) => sum + curr, 1000))
Run Code Online (Sandbox Code Playgroud)