使用reduce函数返回一个数组

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)

比尝试使用函数中的任何一个pushconcatreduce函数内重建新数组简单得多.

  • 有时,您想要执行“.filter().map()”,而不是 O(2N),您可以通过使用“.reduce()”执行一次传递将工作量减半,从而保持 O(N) )。 (5认同)

小智 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)