我正在尝试从头开始实现reduce()。我能够让它工作,但是javascript怎么知道"array“是什么,尽管我从来没有在任何地方定义过它?
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 )编辑:我让它工作了:我把“数组”改成了“这个”,因为我在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)发布于 2019-04-16 11:04:28
你已经很接近了。似乎缺少的一点是,在函数内部,this将被定义为调用函数的数组。所以你可以在你当前正在使用array的地方使用this,它在你的函数中是未定义的(正如你所怀疑的)。您可能还希望在不同的位置开始循环,这取决于是否传入了初始值。例如:
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))
https://stackoverflow.com/questions/55699861
复制相似问题