Подтвердить что ты не робот

Почему Array.prototype.reduce() не принимает пустой массив в качестве аккумулятора?

Я пытаюсь отфильтровать все элементы в массиве, которые больше 10, к новому массиву. Я намеренно не использую Array.prototype.filter(), так как хочу изучить метод reduce(). Вот код, который я играл с

var collection = [3, 5, 11, 23, 1];

// fileter all the elements bigger than 10 to a new array

var output = collection.reduce(function(filteredArr, collectionElemet) {
  if (collectionElemet > 10) {
    return filteredArr.push(collectionElemet);
  }
}, []);
4b9b3361

Ответ 1

Вам нужно вернуть filteredArr из анонимной функции, чтобы он использовался как previousValue для следующего вызова

var collection = [3, 5, 11, 23, 1];

// filter all the elements bigger than 10 to a new array

var output = collection.reduce(function(filteredArr, collectionElement) {
  if (collectionElement > 10) {
    filteredArr.push(collectionElement);
  }
  return filteredArr;
}, []);

Ответ 2

Array.prototype.push вернет длину нового массива. Вам нужно вернуть аккумулятор. Краткий способ сделать это - Array.prototype.concat, так как этот метод действительно вернет массив:

var collection = [3, 5, 11, 23, 1];

var output = collection.reduce(function(filteredArr, collectionElemet) {
  if (collectionElemet > 10) {
    return filteredArr.concat(collectionElemet);
  }
}, []);

Вы должны вернуть аккумулятор, чтобы следующая итерация могла использовать значение аккумулятора.