【问题标题】:Javascript Reduce an empty arrayJavascript减少一个空数组
【发布时间】:2014-06-15 01:36:30
【问题描述】:

当我减少数组时,我试图让数字为零,但我不清楚函数的行为

[].reduce(function(previousValue, currentValue){
  return Number(previousValue) + Number(currentValue);
});

结果

TypeError: Reduce of empty array with no initial value

似乎如果数组为空我无法减少它

[""].reduce(function(previousValue, currentValue){
  return Number(previousValue) + Number(currentValue);
});

结果

""

如果数组中唯一的元素是一个空字符串,则检索一个空字符串

【问题讨论】:

    标签: javascript arrays ecmascript-5


    【解决方案1】:

    在你的例子中,必须先定义前一个值,因为它相当于给一个变量previousValue赋值

    let previousValue = 0; 不同于 let previousValue;

    【讨论】:

      【解决方案2】:

      The second parameter 是初始值。

      [].reduce(function(previousValue, currentValue){
        return Number(previousValue) + Number(currentValue);
      }, 0);
      

      或使用 ES6:

      [].reduce( (previousValue, currentValue) => previousValue + currentValue, 0);
      

      【讨论】:

      • “初始值”是指默认值吗?
      • 我们肯定需要stackoverflow中的
      【解决方案3】:

      我自己也遇到了这个问题,想用一个更简单但更现代的 JavaScript 示例来回答这个问题。

      JavaScript 的数组 reduce 函数迭代数组(此处为 list)并通过使用累加器(此处为 @987654324 @):

      const sum = list.reduce((acc, value) => acc + value);
      

      大多数减少操作更喜欢对初始累加器(第二个参数,也称为初始值)进行操作。在我们的示例中,它确实是强制性的,因为否则 sum 操作将不起作用。我们想将我们的值与初始值 0 相加:

      const sum = list.reduce((acc, value) => acc + value, 0);
      

      reduce 函数的初始值是它的第二个参数(这里是0)。因此,如果您遇到错误:

      TypeError: Reduce of empty array with no initial value
      

      这只是意味着您必须为您的 reduce 操作提供一个初始(空)数组,因为如果您提供一个空数组(此处为 list)开始,它不起作用并抱怨此错误。为了修复它,提供一个空数组作为第二个参数:

      const exponentials = list.reduce((acc, value) => {
        acc = acc.concat(value * value);
        return acc;
      }, []);
      

      【讨论】:

      • 为了更清楚起见,我建议在示例的开头添加const list = [];(任何工作都需要它)
      【解决方案4】:

      这两种行为都是根据the spec

      你不能reduce一个空数组,除非你明确地提供一个初始的“累积”值作为第二个参数:

      如果没有提供 initialValue,那么 previousValue 将等于 数组中的第一个值和 currentValue 将等于 第二。如果数组不包含任何元素并且 未提供 initialValue。

      如果数组至少有一个元素,则提供初始值是可选的。但是,如果未提供,则数组的第一个元素将用作初始值,reduce 通过调用您的回调继续处理其余的数组元素。在您的情况下,数组仅包含一个元素,因此该元素成为初始值和最终值,因为没有更多元素要通过回调处理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-24
        • 2016-10-07
        • 2021-12-19
        • 2021-03-10
        • 1970-01-01
        • 2020-12-07
        • 1970-01-01
        • 2017-09-22
        相关资源
        最近更新 更多