2K0*_*1B5 29 javascript arrays reduce
为什么当我想在reduce函数中使用push函数返回一个新数组时,我得到一个错误.但是,当我在reduce函数中使用concat方法时,它返回一个没有问题的新数组.
我要做的就是将数组传递给reduce函数并返回相同的数组.
var store = [0,1,2,3,4];
var stored = store.reduce(function(pV,cV,cI){
console.log("pv: ", pV);
return pV.push(cV);
},[]);
Run Code Online (Sandbox Code Playgroud)
这会返回错误.但是当我使用concat时:
var store = [0,1,2,3,4];
var stored = store.reduce(function(pV,cV,cI){
console.log("pv: ", pV);
return pV.concat(cV);
},[]);
Run Code Online (Sandbox Code Playgroud)
它返回相同的数组.
有什么想法吗?
Ven*_*aju 50
push 返回数组的新长度.
你需要的是最初提供的数组.
所以更改代码如下.
var store = [0, 1, 2, 3, 4];
var stored = store.reduce(function(pV, cV, cI){
console.log("pv: ", pV);
pV.push(cV);
return pV; // ********* Important ******
}, []);
Run Code Online (Sandbox Code Playgroud)
concat返回组合所提供数组和连接元素的元素的新数组.所以它有效.
Jam*_*iec 21
只是为了完整性,对于发生在这个问题上的下一个人来说,你正在做的事情通常是通过map哪个来实现的,如文档中所述
map按顺序为数组中的每个元素调用一次提供的回调函数,并从结果中构造一个新数组
与以下描述形成鲜明对比reduce:
reduce()方法对累加器和数组的每个值(从左到右)应用函数以将其减少为单个值.
(强调我的)所以你看,虽然你可以操纵reduce返回一个新数组,但它的一般用法是将数组减少到一个值.
所以对于你的代码,这将是:
var store = [0,1,2,3,4];
var stored = store.map(function(pV){
console.log("pv: ", pV);
return pV;
});
Run Code Online (Sandbox Code Playgroud)
比尝试使用函数中的任何一个push或concat在reduce函数内重建新数组简单得多.
小智 9
我知道这是相同的答案,但我只想表明使用reduce (),语法也可以使用 ES6 简化为一行代码:
var store = [0,1,2,3,4];
var stored = store.reduce((pV,cV) => [...pV, cV], []);
console.log(stored);Run Code Online (Sandbox Code Playgroud)