Почему метод filter не фильтрует 0?

Есть такой код:

function filter_list(arr) {
    return arr.filter(item => {
        if (typeof (item) == 'number') return item; // [1, 2]
    }) 
}
console.log(filter_list([1, 2, 0, 'a', 'b']));

Метод filter пропускает 0, даже если написать так:

|| item == 0

Ответы (2 шт):

Автор решения: nörbörnën

Array.prototype.filter()

callback

Функция, которая будет вызвана для каждого элемента массива. Если функция возвращает true, то элемент остаётся в массиве, если false, то удаляется.

В filter в случае когда item === 0 выражение return item будет интерпретировано как return false.

Нужно написать так:

function filter_list_like_in_question(arr) {
  return arr.filter((item) => {
    if (typeof(item) === 'number') {
      return true;
    }
  });
}

function filter_list(arr) {
  return arr.filter(item => typeof(item) === 'number')
}

console.log(filter_list_like_in_question([1, 2, 0, 'a', 'b']));
console.log(filter_list([1, 2, 0, 'a', 'b']));

→ Ссылка
Автор решения: Vasily

Вам не нужно делать return explicitly, в противном случае, при варианте нуля он будет интерпретирован как false.

Достаточно сформировать условие при котором элементы будут оставлены в массиве:

function filter_list(arr) {
  return arr.filter(item => typeof item === "number")
}

const result = filter_list([1, 2, 0, -1, "a", "b"])

console.log(result)
// [1, 2, 0, -1]

→ Ссылка