为什么我不能在.reduce()函数中返回推送到累加器的结果?

时间:2017-01-27 09:23:25

标签: javascript arrays reduce

简单的例子,想要返回一个数组数组。对于'peeps'中的每个名称,我想将带有'hello'一词的数组推入累加器。

const peeps = ['sally', 'nick', 'dave'];

return peeps.reduce((acc, val) => {
     return acc.push(['hello'])
  }, []);

一直说acc.push()不是函数。

有人可以帮助我理解为什么这不起作用。

3 个答案:

答案 0 :(得分:11)

您使用Array#push

  

push() 方法将一个或多个元素添加到数组的末尾,并返回数组的新长度。

这会在推送后返回数组的长度。然后累加器值是一个数字,而不是数组

return acc.push(['hello']) // 1

解决方案1:返回数组而不是推送结果。

const peeps = ['sally', 'nick', 'dave'];

console.log(peeps.reduce((acc, val) => {
    acc.push(['hello']);
    return acc;
}, []));

解决方案2:使用Array#concat

  

concat() 方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。

我会避免使用大量数据,因为它比推送效率低很多。 jsPerf

const peeps = ['sally', 'nick', 'dave'];

console.log(peeps.reduce((acc, val) => acc.concat([['hello']]), []));

解决方案3:使用Array#map。如果结果数组的长度与给定数组的长度相同,则效果最佳。

  

map() 方法创建一个新数组,其结果是在此数组中的每个元素上调用提供的函数。

const peeps = ['sally', 'nick', 'dave'];

console.log(peeps.map(val => ['hello']));

答案 1 :(得分:1)

请改为尝试:

const peeps = ['sally', 'nick', 'dave'];

return peeps.reduce((acc, val) => {
    acc.push(['hello']);
    return acc;
}, []);

push不会返回acc,您必须手动执行。

答案 2 :(得分:1)

我认为你应该试试地图。而不是减少。

const peeps = ['sally', 'nick', 'dave'];

return peeps.map((val) => {
 return ['hello']
});

它将返回一个数组[ ['Hello'],['Hello'],['Hello'] ]

Reduce用于从数组中获取单个值。例如计数,总和,产品等。