Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

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 } был необходим в качестве параметра.

Функция reduce должна объединить два объекта со свойством "score" в новый объект со свойством "score". Вы объединяете их в число.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top