Невозможно удалить все логические == false в массиве [duplicate]

1

Дан массив с разными типами данных. Я пишу функцию, чтобы найти те значения, которые являются 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.

Большое спасибо за разъяснения.

  • 1
    В JavaScript есть понятие «ложь», поэтому используйте === вместо == . Узнайте больше здесь: developer.mozilla.org/en-US/docs/Glossary/Falsy
  • 2
    Не меняйте массив, по которому вы перебираете, если вы не знаете, что делаете;) Проверяйте элементы на каждом шаге. (Подсказка: что происходит с элементами после удаляемого элемента?)
Теги:
arrays
boolean
splice

5 ответов

1
Лучший ответ

Как говорят другие люди, вы можете использовать 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"]);
1

Вы почти закончили, но было бы лучше проверить, какие значения являются ложными, а не сравнивать их, так что эта функция сделает свое дело

const getNonFalsyValues = (arr) => {
  return arr.reduce((arr, current) => {
    if (Boolean(current)) {
        arr.push(current);
    }
    return arr;
  }, []);
}

Я надеюсь, что это может помочь вам.

0

В JavaScript некоторые значения оцениваются как false, например, null, пустая строка '' и undefined. Вы можете узнать больше об оценке в JavaScript здесь.

Также вы должны использовать === вместо == в сравнениях. Смотрите это.

0

Просто используйте фильтр, как это.

Что делает фильтр здесь, так это добавляет значение в выходной массив, только если оно истинно.

let arr = [false, null, 0, NaN, undefined, "", 1 , 123];
let op = arr.filter(value => value);
console.log(op)
0
const bouncer = (arr) => arr.filter(val => !!val);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню