2016-01-19 50 views
1

我试图创建一个函数,该函数将一个数组作为参数,然后将数组的每个元素乘以其索引,然后将它们相加并返回这些值。但是,我收到我无法解释的回报。Javascript .reduce()未按预期运行?

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 

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

+0

你只是不断加入到'sum'变量。你需要重置'sum'才能得到你所期望的。 – Lends

回答

3

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

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

previousValue代表什么?以前的回报? –

+1

@ komali_2:当您使用'reduce'参数减少时,'previousValue'是从循环的上一次迭代(或第一次迭代的种子值)返回*的值。 –

0

似乎有关于如何减少工作的根本误解。目前的答案并不反映减少的简单性。

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

回调参数

  • PREVIOUSVALUE:这是因为你通过数组迭代正在被收集的值。这不是真的“以前” - 它实际上是最新的。将此称为“currentTotal”比以前的值更准确。
  • CurrentValue的:这也就意味着它在我们的迭代
  • indexValue当前值:到currentValue
  • 数组的索引:你遍历数组。

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

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

欲了解更多有关reduce退房的docs