【问题标题】:Why can't I return the result of pushing to the accumulator in a .reduce() function?为什么我不能在 .reduce() 函数中返回推送到累加器的结果?
【发布时间】:2017-06-12 22:23:07
【问题描述】:

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

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

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

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

谁能帮我理解为什么这不起作用。

【问题讨论】:

  • 我意识到我可以在 reduce 函数中创建一个空数组,然后推送到该数组,然后返回我的数组。但我想了解为什么如果没有一点 hack 的感觉它就无法工作。
  • 你可以做return acc.concat(['hello']);
  • 'For each name'... forEach 或 map 在这种情况下看起来是一个更好的选择。 Reduce 是为了……嗯……减少数组?

标签: javascript arrays reduce


【解决方案1】:

你使用Array#push

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

这将返回推入后数组的长度。那么累加器的值是一个数字,而不是一个数组

return acc.push(['hello']) // 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']));

【讨论】:

    【解决方案2】:

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

    const peeps = ['sally', 'nick', 'dave'];
    
    return peeps.map((val) => {
     return ['hello']
    });
    

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

    Reduce 用于从数组中获取单个值。例如计数、总和、乘积等。

    【讨论】:

    • 这是一个人为的例子来说明我的问题,我需要在 reduce 的上下文中理解它。你是对的,地图更适合我这个愚蠢的例子。
    【解决方案3】:

    试试这个:

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

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

    【讨论】:

      猜你喜欢
      • 2018-06-12
      • 2018-11-21
      • 2021-11-01
      • 2018-03-05
      • 1970-01-01
      • 2019-12-16
      • 2021-06-28
      • 2016-07-03
      • 1970-01-01
      相关资源
      最近更新 更多