Почему lowerRight возвращает NaN в Javascript? - PullRequest
0 голосов
/ 22 января 2010

Я использую Firefox 3.5.7 и в Firebug я пытаюсь протестировать функцию array.reduceRight, она работает для простых массивов , но когда я пытаюсь что-то подобное, я получаю 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

Я также попробовал map и, по крайней мере, я вижу компонент .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, но, очевидно, я не могу заставить ее работать, чтобы суммировать все значения score в моем массиве details . Почему?

Ответы [ 3 ]

7 голосов
/ 22 января 2010

Первым аргументом функции является накопленное значение. Таким образом, первый вызов функции будет выглядеть как f(0, {score: 1}). Поэтому, когда вы делаете x.score, вы на самом деле делаете 0.score, который, конечно, не работает. Другими словами, вы хотите x + y.score.

4 голосов
/ 22 января 2010

попробуйте это (преобразует в числа как побочный эффект)

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 голосов
/ 22 января 2010

Функция сокращения должна объединять два объекта со свойством «оценка» в новый объект со свойством «оценка». Вы объединяете их в число.

...