Учитывая массив с разными типами данных. Я пишу функцию, чтобы найти те значения, которые являются false, и вернуть массив без значений falsy.
Например:
[7, "ate", "", false, 9] should return [7, "ate", 9].
Это мой текущий код:
function bouncer(arr)
{
for (var i = 0; i < arr.length; i++)
{
if (Boolean(arr[i]) == false)
{
arr.splice(i, 1);
}
}
console.info(arr);
}
Однако есть проблема:
Я.)
In case of Input: bouncer([7, "ate", "", false, 9])
It returns: [ 7, 'ate', false, 9 ]
But it should return: [7, "ate", 9]
II.)
In case of input: `bouncer([false, null, 0, NaN, undefined, ""]);`
It returns: [ null, NaN, '' ]
But it should return: []
Я не понимаю, почему он возвращает логические ложные значения, такие как NaN или null. Но он правильно соединяет такие значения, как пустые строки ("") или undefined.
И я тоже не понимаю, почему в первом случае он возвращает false (что не предназначено), а во втором случае не возвращает false.
Большое спасибо за разъяснения.
Не меняйте массив, который вы повторяете, если вы не знаете, что делаете;) Проверяйте элементы на каждом шаге. (Подсказка: что происходит с элементами после удаляемого элемента?)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Просто используйте фильтр вот так.
Что делает фильтр здесь, так это то, что он добавляет значение в выходной массив, только если оно истинно.
let arr = [false, null, 0, NaN, undefined, "", 1 , 123];
let op = arr.filter(value => value);
console.info(op)const bouncer = (arr) => arr.filter(val => !!val);
Вы почти закончили, но было бы лучше проверить, какие значения ложны, вместо того, чтобы сравнивать их, так что эта функция сделает свое дело.
const getNonFalsyValues = (arr) => {
return arr.reduce((arr, current) => {
if (Boolean(current)) {
arr.push(current);
}
return arr;
}, []);
}
Надеюсь, это поможет тебе.
Как говорят другие, для этой цели можно использовать filter(). Самый короткий путь:
const array = [false, null, true, 0, NaN, undefined, "", "Hola Mundo"];
console.info(array.filter(Boolean));.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}Однако, возвращаясь к вашему коду, вы должны заметить, что метод splice() изменит массив при обнаружении значения falsy (поскольку удаляет один элемент). Другими словами, arr.length динамически уменьшается во время выполнения цикла, но переменная i продолжает увеличиваться. Это приводит к тому, что цикл фактически не зацикливает все элементы в массиве. Чтобы исправить это, вам нужно уменьшить значение переменной i, когда вы удаляете элемент из массива. Проверьте следующий код:
function bouncer(arr)
{
for (var i = 0; i < arr.length; i++)
{
if (Boolean(arr[i]) === false)
{
arr.splice(i, 1);
i = i - 1;
}
}
console.info(arr);
}
bouncer([false, null, true, 0, NaN, undefined, "", "Hola Mundo"]);.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
В JavaScript есть понятие «ложь», поэтому используйте
===вместо==. Подробнее здесь: developer.mozilla.org/en-US/docs/Glossary/Falsy