Javascript .reduce()无法按预期运行?

时间:2016-01-19 18:05:30

标签: javascript arrays function callback

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

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

为什么我没有得到我期望的结果?实际上做的功能是什么?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

似乎存在对减少如何运作的根本误解。答案目前并未反映出简化的简单性。

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

回调参数

  • previousValue:这是在遍历数组时收集的值。它不是真的"之前" - 它实际上是最新的。将此称为" currentTotal"更准确。比以前的价值。
  • currentValue:这只是意味着它在迭代中的当前值
  • indexValue:currentValue的索引
  • array:您正在迭代的数组。

通过这些信息,我们可以简化您的操作

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

有关reduce的详情,请查看docs