【问题标题】:Javascript .reduce() not functioning as expected?Javascript .reduce() 没有按预期运行?
【发布时间】:2016-01-19 18:05:29
【问题描述】:

我正在尝试创建一个函数,该函数将数组作为参数,然后将数组的每个元素乘以其索引,然后求和并返回这些值。但是,我得到了我无法解释的回报。

var sum = 0;
function crazy_sum(numbers){
 return numbers.reduce(function(previousValue,currentValue,currentIndex,array){
        sum += currentValue*currentIndex;
        return sum;
    },0);
};


console.log(crazy_sum([2])); //returns 0, as expected
console.log(crazy_sum([2,3])); //returns 3, as expected
console.log(crazy_sum([2,3,5])); //returns 16 when I would expect 13
console.log(crazy_sum([2,3,5,2])); //returns 35 when I would expect 19

为什么我没有得到预期的结果?该函数实际上在做什么?

【问题讨论】:

  • 您只需继续添加到sum 变量。您需要重置 sum 以获得您所期望的。

标签: javascript arrays function callback


【解决方案1】:

您不需要sum,使用previousValue 参数:

function crazy_sum(numbers){
 return numbers.reduce(function(previousValue,currentValue,currentIndex,array){
        previousValue+= currentValue*currentIndex;
        return previousValue;
    },0);
};

【讨论】:

  • previousValue 代表什么?之前的回报?
  • @komali_2:当您使用 reduce 参数进行归约时,previousValue 是从循环的上一次迭代(或您的种子)返回的值第一次迭代的值)。
【解决方案2】:

对于 reduce 的工作原理似乎存在根本性的误解。目前的答案并不能反映 reduce 的简单性。

当使用 reduce 时,您提供的是 2 个参数 - 一个函数回调和一个起始值。

回调参数

  • previousValue:这是在您遍历数组时收集的值。它并不是真正的“以前的”——它实际上是相当新的。将其称为“currentTotal”比以前的值更准确。
  • currentValue:这只是表示它在我们的迭代中的当前值
  • indexValue:当前值的索引
  • array:您正在迭代的数组。

有了这些信息,我们可以简化您的操作

function crazy_sum(numbers){
    return numbers.reduce(function(currentTotal,currentValue,currentIndex){
        return currentTotal + currentValue * currentIndex;
    }, 0);
}

有关reduce的更多信息,请查看docs

【讨论】:

    猜你喜欢
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    相关资源
    最近更新 更多