我正在尝试使用array.map()
来实施array.reduce()
。这是我到目前为止所做的:
function arrayMap(arr, fn) {
return arr.reduce(function(a, elem) {
return a.push(fn(elem));
}, []);
}
let x = arrayMap([1, 2, 3], function(elem) {
return elem * 2;
});
console.log(x);
但是翻译给了我:
TypeError:a.push不是函数
即使提供累加器'a'
以作为空数组减少。
答案 0 :(得分:3)
Array#push
方法返回数组的长度,并返回长度。所以在下一次迭代中,a
将是一个数字(1
)而不是数组。
要使其工作,您需要返回数组引用。
function arrayMap(arr, fn) {
return arr.reduce(function(a, elem) {
a.push(fn(elem));
return a;
}, []);
}
function arrayMap(arr, fn) {
return arr.reduce(function(a, elem) {
a.push(fn(elem));
return a;
}, []);
}
let x = arrayMap([1, 2, 3], function(elem) {
return elem * 2;
});
console.log(x);

实际上,Array#reduce
方法使其更复杂,更好的想法是使用Array#map
方法。
function arrayMap(arr, fn) {
return arr.map(fn);
}
function arrayMap(arr, fn) {
return arr.map(fn);
}
let x = arrayMap([1, 2, 3], function(elem) {
return elem * 2;
});
console.log(x);

答案 1 :(得分:3)
改为使用Array.concat()。
function arrayMap(arr, fn) {
return arr.reduce(function(a, elem) {
return a.concat(fn(elem));
}, []);
}
let x = arrayMap([1, 2, 3], function(elem) {
return elem * 2;
});
console.log(x); // [2, 4, 6]
答案 2 :(得分:0)
您可以使用Array.prototype.reduce()的参数currentIndex
,{{3}}是数组中正在处理的当前元素的索引。如果提供了initialValue,则从索引0开始,否则从索引1开始。
function arrayMap(arr, fn) {
return arr.reduce(function(a, elem, currentIndex) {
a[currentIndex] = fn(elem);
return a;
}, []);
}
let x = arrayMap([1, 2, 3], function(elem) {
return elem * 2;
});
console.log(x);