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

Учитывая массив с разными типами данных. Я пишу функцию, чтобы найти те значения, которые являются 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 есть понятие «ложь», поэтому используйте === вместо ==. Подробнее здесь: developer.mozilla.org/en-US/docs/Glossary/Falsy

Dai 08.01.2019 18:02

Не меняйте массив, который вы повторяете, если вы не знаете, что делаете;) Проверяйте элементы на каждом шаге. (Подсказка: что происходит с элементами после удаляемого элемента?)

Andreas 08.01.2019 18:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
2
697
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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

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;
  }, []);
}

Надеюсь, это поможет тебе.

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

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

Ответ принят как подходящий

Как говорят другие, для этой цели можно использовать 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;}

Другие вопросы по теме