2015-09-12 3 views
0

Если добавить все натуральные числа меньше 1000, которые кратны 3 или 5.Подчеркивание .reduce() возвращает NaN?

var sum = _.reduce(_.range(1, 1000), function(x, n) { 
    if (n % 3 == 0 || n % 5 == 0) { return x+=n; } 
}, 0); 

Я ожидаю, что выход будет 233168, но я получаю NaN.

По какой-то причине sum не принимает инициализированное значение 0. Однако, если я предисловие это с var sum = 0;, то он работает и возвращает правильный вывод 233168

Почему он не принимает инициализированное значение?

+4

Что вы возвращаете, если число не кратно 3 или 5? – thefourtheye

+0

Просто FYI, вы можете суммировать кратные в последовательном диапазоне без цикла. Это можно сделать только с помощью математики. –

ответ

4

Проблема заключается в том, что функция уменьшения возвращает undefined, когда условие не выполняется. Таким образом, x оценивает неопределенное (последнее возвращаемое значение) в последующем вызове .. и не определено + число .. ну, NaN.

Также, reduce используется неправильно; он должен нести свое собственное государство. Сравните с:

var sum = _.reduce(_.range(1, 1000), function(x, n) { 
    // Add n to the tally if it is a valid multiple.. 
    // (the returned value is used as the *next* value of x) 
    if (n % 3 == 0 || n % 5 == 0) { return x + n; } 
    // ..or simply return the current tally. 
    else { return x; } 
}, 0); 

Обратите внимание, что переменная sumбыли не назначен внутри восстановительной функции (она была бы переписана внешним назначением в любом случае). Это сохраняет reduce чистую операцию, не выдерживая случайного злоупотребления изменчивой запиской, вернее ее functional roots.

+0

Да, я изначально имел '{return x + = n; } ', но он возвращал' undefined', поэтому я поменял его на '{return sum + = n; } '. Я изменил его, хотя. Спасибо за помощь! – fyz

+0

Было бы очень полезно, если бы вы могли поделиться тем, как вы знали, что это проблема? – fyz

Смежные вопросы