问题描述
我对javascript比较陌生,并尝试对以下数组中的所有分数求和:
[
{ tile: "N",score: 1 },{ tile: "K",score: 5 },{ tile: "Z",score: 10 },{ tile: "X",score: 8 },{ tile: "D",score: 2 },{ tile: "A",{ tile: "E",score: 1 }
]
我尝试使用此功能:
function maximumscore(tileHand) {
return tileHand.reduce((p,c) => p.score + c.score,0);
}
但是我得到的结果是NaN
而不是28。但是,当我用p.score
替换函数中的p
时,得到的预期结果是28。
为什么会这样?
解决方法
reduce的第一个参数是累加器。因此,将值添加到其中。因此,它基本上是一个变量。
function maximumScore(tileHand) {
return tileHand.reduce((p,c) => p + c.score,0);
}
这将继续为p添加分数,该分数从0开始
另请参见mozilla.org
,这样做的原因是,您使用的.reduce()
方法的回调最多包含4个参数,而第一个是 accumulator 。这意味着它保存了回调返回的所有先前结果的累加值。在这种情况下,它是一个数字,而不是一个对象。因此,在每次迭代中,您在p
参数下拥有当前总和,而不是一个对象。
从文档中
,
accumulator
累加器累加回调的返回值。它是先前在的上一次调用中返回的累计值 回调-或
initialValue
(如果已提供)(请参见下文)。
// get sum of score prop across all objects in array i.e. tileHand
var scoreTotal = tileHand.reduce(function(prev,cur) {
return prev + cur. score;
},0);
console.log('Total Score:',scoreTotal);
引用:https://gist.github.com/benwells/0111163b3cccfad0804d994c70de7aa1
,p代表前一个(或累加器/总和),c代表当前。您正在将以前的分数与当前分数相加。然后,您告诉reduce函数从0开始
因此,它尝试将0.score + c.score相加,得出NaN。
只要做p + c.score
所以循环将会
0 +1 = 1
1 + 5 = 6
6 + 10 = 16
等