Разница между concat и push?

Почему возвращение метода push вызывает "Uncaught TypeError: acc.push не является функцией". Но возврат concat приводит к правильному решению?

[1, 2, 3, 4].reduce(function name(acc, curr) {
  if (even(curr)) {
    return acc.push(curr);
  }
  return acc;
}, []);


function even(number) {
  if (number % 2 === 0) {
    return true;
  }
  return false;
}

Ответ 1

Функция push() добавляет элементы в конец массива и возвращает новую длину массива. Таким образом, ваше возвращение здесь недействительно.

Метод concat() используется для объединения массивов. Concat не изменяет существующие массивы, но вместо этого возвращает новый массив.

Лучше фильтровать, если вам нужен новый массив:

var arr = [1, 2, 3, 4];
var filtered = arr.filter(function(element, index, array) {
  return (index % 2 === 0);
});

Обратите внимание, что предполагается, что массив arr завершен без пробелов - все даже индексированные значения. Если вам нужен каждый человек, используйте element вместо index

var arr = [1, 2, 3, 4];
var filtered = arr.filter(function(element, index, array) {
  return (element% 2 === 0);
});

Ответ 2

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

Нет никакого смысла reduce массив до массива. Вы хотите filter. Я имею в виду, reduce использование массива в качестве аккумулятора и concat каждый элемент, чтобы он технически работал, но это не совсем правильный подход.

var res = [1, 2, 3, 4].filter(even);
console.log(res);


function even(number) {
  return (number % 2 === 0);
}