@pacan4ik

По какому принципу работает reduce с массивом, как значением по умолчанию?

array.reduce((a,b,i)=>(a[i%2]+=b,a), [0,0])
Зачем здесь нам += a, b, а не просто b, если мы по факту говорим а[...] += b
Т.е. уже сослались на наш массив, к чему его полностью через запятую передавать?
  • Вопрос задан
  • 68 просмотров
Решения вопроса 2
Stalker_RED
@Stalker_RED
function test() {
  const a = [1];
  return a[0] += 3; // что вы вернет?
}

По вашей логике массив a?
На самом деле вернется результат операции сложения, то есть 4.
А если добавить оператор запятую, то вернет то, что после запятой, что и требуется для reduce.

Распишем подробно что происходит внутри reduce c запятой и без.
// с запятой
array.reduce((a,b,i)=>function(){
  const sum = a[i%2] + b; // вычисление
  a[i%2] = sum; // присваивание
  return a; // возврат массива
}, [0,0]);

// без запятой
array.reduce((a,b,i)=>function(){
  const sum = a[i%2] + b; // вычисление
  a[i%2] = sum; // присваивание
  return sum; // возврат результат суммирования
   // и на следующей итерации будет ошибка из-за попытки обратиться к числу как к массиву.
}, [0,0]);
Ответ написан
sergiks
@sergiks Куратор тега JavaScript
♬♬
То же самое, распакованное:
array.reduce(
  (acc, current, i) => {
    acc[i % 2] += current; // к чётному/нечетному прибавить
    return acc; // вернуть массив
  },
  [0, 0]  // начальное значение
)

Перечисление через запятую всё выполнит, вернёт результат последнего:
let a, b;
console.log(
  ( a = 2 + 2, b = ["QnA", "Habr", "com"].join("."), "Отметить решением" )
); 
// "Отметить решением"
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы