¿Por qué volver reduceRight NaN en Javascript?
-
22-09-2019 - |
Pregunta
Estoy usando Firefox 3.5.7 y dentro de Firebug que estoy tratando de probar la función array.reduceRight, funciona para matrices simples pero cuando intento algo así consigo un NaN . ¿Por qué?
>>> 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
También trató mapa y al menos puedo ver el componente .score de cada elemento:
>>> details.map(function(x) {console.log (x.score);})
1
2
3
[undefined, undefined, undefined]
He leído la documentación en https: //developer.mozilla. org / es / Core_JavaScript_1.5_Reference / Objetos / array / reduceRight pero al parecer no puedo conseguir que funcione para resumir toda la score los valores en mi detalles formación. ¿Por qué?
Solución
El primer argumento dado a la función es el valor acumulado. Así que la primera llamada a la función se verá como f(0, {score: 1})
. Así que cuando se hace x.score, en realidad estás haciendo 0.score que no funciona, por supuesto. En otras palabras, usted quiere x + y.score
.
Otros consejos
probar este (se convertirá en números como efecto secundario)
details.reduceRight(function(previousValue, currentValue, index, array) {
return previousValue + currentValue.score;
}, 0)
o este
details.reduceRight(function(previousValue, currentValue, index, array) {
var ret = { 'score' : previousValue.score + currentValue.score} ;
return ret;
}, { 'score' : 0 })
Gracias a @ sepp2k para señalar cómo se necesitaba { 'score' : 0 }
como parámetro.
El reducen la función debe combinar dos objetos con una "puntuación" propiedad en un nuevo objeto con una propiedad "puntuación". Los estás combinando en un número.