简单的例子,想要返回一个数组数组。对于'peeps'中的每个名称,我想将带有'hello'一词的数组推入累加器。
const peeps = ['sally', 'nick', 'dave'];
return peeps.reduce((acc, val) => {
return acc.push(['hello'])
}, []);
一直说acc.push()不是函数。
有人可以帮助我理解为什么这不起作用。
答案 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用于从数组中获取单个值。例如计数,总和,产品等。