为什么当我想在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);
},[]);
这会返回一个错误。但是当我使用 concat 时:
var store = [0,1,2,3,4];
var stored = store.reduce(function(pV,cV,cI){
console.log("pv: ", pV);
return pV.concat(cV);
},[]);
它返回相同的数组。
有什么想法吗?
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 ******
}, []);
concat
返回组合了所提供数组的元素和连接元素的新数组。所以它有效。
为了完整起见,对于下一个遇到这个问题的人,你所做的通常是通过
map
来实现的,正如文档中所述
map 按顺序为数组中的每个元素调用一次提供的回调函数,并根据结果构造一个新数组
reduce
的描述对比:
reduce() 方法对累加器和数组的每个值(从左到右)应用一个函数,以将其减少 为单个值。
(强调我的)所以你看,虽然你可以操作
reduce
来返回一个新数组,但它的一般用法是将数组减少为单个值。
所以对于你的代码来说,这将是:
var store = [0,1,2,3,4];
var stored = store.map(function(pV){
console.log("pv: ", pV);
return pV;
});
比尝试在
push
函数中使用 concat
或 reduce
重建新数组要简单得多。
我知道这是相同的答案,但我只是想表明,使用
reduce ()
,语法也可以使用 ES6 简化为一行代码:
var store = [0,1,2,3,4];
var stored = store.reduce((pV,cV) => [...pV, cV], []);
console.log(stored);
reduce()
会很有用:
var inputs = media.reduce((passedArray, video) => {
passedArray.push("-i");
passedArray.push(video.filepath);
return passedArray;
}, []);
这里它被用来构建 FFmpeg 的输入数组;
[{ name: "bob", filepath: "1.mp4" }, { name: "sue", filepath: "3.mp4" }]
=> ["-i", "1.mp4", "-i", "2.mp4]
Array.prototype.push方法返回数组的新长度。
Array.prototype.concat方法将新元素插入数组并返回数组,以便可以进一步处理。这就是您需要对reduce 执行的操作:将修改后的数组传递给下一次迭代。
您始终可以使用解构:
var store = [0,1,2,3,4];
var stored = store.reduce(function(pV,cV,cI){
console.log("pv: ", pV);
return [...pV, cV];
},[]);
console.log(stored);
这是一个使用
push()
方法与 &&
运算符结合使用的单行代码:
let store = [0,1,2,3,4];
let stored = store.reduce((pV,cV) => pV.push(cV) && pV, []);
console.log(stored);