我正在尝试从头开始实现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)