2010-01-22 142 views
0

我使用Firefox 3.5.7和Firebug内我试图测试array.reduceRight函数,它适用于简单数组但是当我尝试这样的事情时,我得到一个NaN。为什么?为什么reduceRight在Javascript中返回NaN?

>>> var details = [{score : 1}, {score: 2}, {score: 3}]; 
>>> details 
[Object score=1, Object score=2, Object score=3] 
>>> details.reduceRight(function(x, y) {return x.score + y.score;}, 0) 
NaN 

我也尝试过地图,至少我可以看到每个元素的.score组件:

>>> details.map(function(x) {console.log (x.score);}) 
1 
2 
3 
[undefined, undefined, undefined] 

我阅读文档在https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight但显然我不能让它工作总结全部得分值我的详细资料数组。为什么?

回答

6

给函数的第一个参数是累计值。因此,第一次调用该函数将看起来像f(0, {score: 1})。所以当做x.score时,你实际上正在做0.score,当然这不起作用。换句话说,你想要x + y.score

+1

所以基本上,当你通过初始值reduceRight时,它表现为折叠。我没有意识到这一点。 – 2010-01-22 15:17:31

+1

我开悟了!谢谢。 – 2010-01-22 15:34:35

4

试试这个

details.reduceRight(function(previousValue, currentValue, index, array) { 
    return previousValue + currentValue.score; 
}, 0) 

或本

details.reduceRight(function(previousValue, currentValue, index, array) { 
    var ret = { 'score' : previousValue.score + currentValue.score} ; 
    return ret; 
}, { 'score' : 0 }) 

感谢(将转换为数字的副作用),以@ sepp2k您指出{ 'score' : 0 }是如何需要作为参数。

0

reduce函数应该将具有属性“分数”的两个对象组合为具有属性“分数”的新对象。你将它们组合成一个数字。

+0

该函数应该将a类型的对象和b类型的对象(其中a是初始值的类型,b是数组的元素类型)合并到a类型的对象中。 a和b不必是相同的类型。 – sepp2k 2010-01-22 15:17:39

+0

是的,我意识到这一点。我主要使用Scala,其中reduce操作总是生成一个与输入列表类型相同的值。在Scala中,将列表中的值累加到另一个类型的值中的操作称为fold。 – 2010-01-22 15:35:14