Javascript.reduce()未按预期运行?

Javascript.reduce()未按预期运行?,javascript,arrays,function,callback,Javascript,Arrays,Function,Callback,我试图创建一个函数,该函数将数组作为参数,然后将数组的每个元素乘以其索引,然后求和并返回这些值。然而,我得到了无法解释的回报 var sum = 0; function crazy_sum(numbers){ return numbers.reduce(function(previousValue,currentValue,currentIndex,array){ sum += currentValue*currentIndex; return sum;

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

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
,请使用
previousValue
参数:

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

对于reduce是如何工作的,似乎存在着一个根本性的误解。目前的答案并不反映reduce的简单性

使用
reduce
时,您提供的是两个参数—一个函数回调和一个起始值

回调参数

  • previousValue:这是在遍历数组时收集的值。它不是真正的“以前的”-它实际上是相当当前的。将其称为“currentTotal”比之前的值更准确
  • currentValue:这只意味着它是我们迭代中的当前值
  • indexValue:当前值的索引
  • 数组:您正在迭代的数组
有了这些信息,我们可以简化您的操作

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

有关
reduce
的更多信息,请查看您刚刚添加到
sum
变量的。您需要重置
sum
以获得所需值。previousValue代表什么?上一次返回?@komali_2:当您使用
reduce
参数进行减少时,
previousValue
是从循环的上一次迭代返回的值(或第一次迭代的种子值)。