splice
изменяет массив, что нехорошо делать во время итерации по массиву ; если элемент на i
определен как ложный и имеет значение spliced
, то после завершения итерации цикла for
значение i
будет увеличено на единицу. Так, например, если i
начался в 2
, элемент в 2 удален, тогда элемент, который был в 3, теперь в 2. Но элемент новый 2 никогда не проверяется, поскольку i
увеличено до 3.
Вместо этого используйте .filter
, который оценивает каждый элемент массива и не имеет проблем с индексацией, а также не требует ручной итерации:
const bouncer = (arr) => arr.filter((item) => {
switch (item) {
case false:
case null:
case 0:
case "":
case undefined:
case NaN:
return false;
}
return true;
});
console.log(bouncer([7, "ate", false, "", 9]));
Или, конечно, вы можете просто проверить, является ли каждый предмет ложным или нет:
const bouncer = (arr) => arr.filter(Boolean);
console.log(bouncer([7, "ate", false, "", 9]));