Дан массив с разными типами данных. Я пишу функцию, чтобы найти те значения, которые являются 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.log(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
.
Большое спасибо за разъяснения.
Как говорят другие люди, вы можете использовать filter()
для этой цели. Самый короткий путь будет:
const array = [false, null, true, 0, NaN, undefined, "", "Hola Mundo"];
console.log(array.filter(Boolean));
Однако, возвращаясь к вашему коду, вы должны заметить, что метод 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.log(arr);
}
bouncer([false, null, true, 0, NaN, undefined, "", "Hola Mundo"]);
Вы почти закончили, но было бы лучше проверить, какие значения являются ложными, а не сравнивать их, так что эта функция сделает свое дело
const getNonFalsyValues = (arr) => {
return arr.reduce((arr, current) => {
if (Boolean(current)) {
arr.push(current);
}
return arr;
}, []);
}
Я надеюсь, что это может помочь вам.
Просто используйте фильтр, как это.
Что делает фильтр здесь, так это добавляет значение в выходной массив, только если оно истинно.
let arr = [false, null, 0, NaN, undefined, "", 1 , 123];
let op = arr.filter(value => value);
console.log(op)
const bouncer = (arr) => arr.filter(val => !!val);
===
вместо==
. Узнайте больше здесь: developer.mozilla.org/en-US/docs/Glossary/Falsy