@zlodiak

Почему среднее значение разное?

Помогите пожалуйста понять почему такой код выводит среднее значение = 3:
var a = Rx.Observable.range(1, 5)
	.reduce((prev, curr) => {
  	return {
    	sum: prev.sum + curr,
      count: prev.count + 1
    };
  }, { sum: 0, count: 0 })
  .map(o => {
  	return o.sum / o.count;
  })
  
a.subscribe(x => console.log('avg is:', x));


А такой код, выводит среднее значение = 2:
var a = Rx.Observable.range(0, 5)
	.reduce((prev, curr) => {
  	return {
    	sum: prev.sum + curr,
      count: prev.count + 1
    };
  }, { sum: 0, count: 0 })
  .map(o => {
  	return o.sum / o.count;
  })
  
a.subscribe(x => console.log('avg is:', x));


Как работает в нативном js оператор reduce я представляю. Но не понимаю почему во втором случае ноль в последовательности так меняет результат.
  • Вопрос задан
  • 131 просмотр
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Второй параметр в range - это количество элементов, а не конечное значение (как вам, по-видимому, показалось).

То есть, в первом случае последовательность такая: 1, 2, 3, 4, 5. А во втором такая: 0, 1, 2, 3, 4. Соответственно, 15 / 5 = 3, 10 / 5 = 2, всё правильно.
Ответ написан
Комментировать
rockon404
@rockon404
Frontend Developer
range создает диапазон range(n, m) по формуле:
n, n + 1, n + 2, ..., n + m - 1

В первом случае диапазон от 1 до 5, так как 1 + 5 - 1 = 5:
1, 2, 3, 4, 5
Во втором случае диапазон от 0 до 4, так как 0 + 5 - 1 = 4:
0, 1, 2, 3, 4

Сумма в первом случае:
{ sum: 15, count: 5 }
во втором:
{ sum: 10, count: 5 }

Другими словами n - это первое значение диапазона, m - количество элементов входящих в диапазон.

Результат, в первом случае:
x = 15 / 5;
во втором:
x = 10 / 5;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы