Avatar ·

Как удалить пустые элементы из массива в JavaScript?

Привет! Я новичок в JavaScript и столкнулся с проблемой при работе с массивами. У меня есть массив, который приходит из формы или парсинга данных. В нём есть пустые строки, null, undefined и просто пустые элементы. Мне нужно получить чистый массив только с реальными данными. Вот пример: ```javascript const messyArray = ['apple', '', 'banana', null, 'cherry', undefined, 'date', ' ', false, 0]; ``` Я хочу получить на выходе: `['apple', 'banana', 'cherry', 'date']`. Пробовал делать так: ```javascript const cleanArray = messyArray.filter(item => item); ``` Но это удаляет только `null` и `undefined`, а пустые строки и `false` остаются. Потом попробовал: ```javascript const cleanArray = messyArray.filter(item => item !== ''); ``` Но это не убирает `null` и `undefined`. Я перепробовал кучу вариантов, но каждый раз что-то остаётся. Может есть универсальный способ? Подскажите, как правильно удалить все пустые, ложные и бесполезные элементы из массива? Желательно с объяснением, чтобы я понял логику. <<>>

Универсальное решение: фильтрация с проверкой на "пустоту"

Для удаления всех пустых, ложных и бессмысленных элементов из массива лучше всего использовать метод filter() с кастомной функцией проверки. Рассмотрим несколько подходов от простого к сложному.

1. Удаление всех "ложных" (falsy) значений

В JavaScript есть 6 falsy значений: false, 0, '' (пустая строка), null, undefined, NaN. Если вам нужно удалить их все, используйте:

const messyArray = ['apple', '', 'banana', null, 'cherry', undefined, 'date', '  ', false, 0];
const cleanArray = messyArray.filter(Boolean);
// Результат: ['apple', 'banana', 'cherry', 'date', '  ']

Boolean — это встроенная функция, которая преобразует значение в true/false. filter(Boolean) автоматически отбрасывает все falsy значения. Но! Обратите внимание: строка с пробелами ' ' осталась, потому что это truthy значение (непустая строка).

2. Удаление пустых строк и строк только из пробелов

Если нужно удалить ещё и строки, состоящие только из пробелов, добавьте проверку trim():

const cleanArray = messyArray.filter(item => {
    if (typeof item === 'string') {
        return item.trim() !== '';
    }
    return Boolean(item);
});
// Результат: ['apple', 'banana', 'cherry', 'date']

Здесь логика:

  • Если элемент — строка, проверяем, не пустая ли она после удаления пробелов (trim())
  • Если элемент не строка, используем Boolean(item) для отсеивания falsy значений

3. Самый жёсткий вариант — удалить ВСЁ, что не является "настоящим" значением

Допустим, вы хотите оставить только строки, числа и булевы значения, которые имеют смысл. Удалить null, undefined, пустые строки, строки из пробелов, NaN, но оставить 0 и false (если они нужны как данные):

const cleanArray = messyArray.filter(item => {
    // Удаляем null и undefined
    if (item === null || item === undefined) return false;
    // Удаляем NaN (единственное значение, которое не равно самому себе)
    if (typeof item === 'number' && isNaN(item)) return false;
    // Для строк — удаляем пустые и состоящие из пробелов
    if (typeof item === 'string' && item.trim() === '') return false;
    // Всё остальное оставляем
    return true;
});
// Результат: ['apple', 'banana', 'cherry', 'date', false, 0]

4. Если нужно удалить "пустые" элементы в буквальном смысле (дырки в массиве)

Иногда массив содержит "дырки" — элементы, которые не были присвоены:

const arr = ['a', , 'b', , 'c']; // Дырки на месте 1 и 3
const clean = arr.filter(() => true);
// Результат: ['a', 'b', 'c']

Метод filter() автоматически пропускает дырки в массиве. Даже если функция всегда возвращает true, пустые слоты не попадут в результат.

Итоговая рекомендация

Для 90% случаев используйте filter(Boolean) — это самое короткое и понятное решение. Если нужно удалить ещё и пробельные строки — добавляйте проверку с trim(). Всегда помните, что 0 и false — это falsy значения, и если они важны для ваших данных, их нужно обрабатывать отдельно.

<<>>

Альтернативный подход: использование reduce()

Метод filter() — самый популярный, но иногда удобнее использовать reduce(), особенно если нужно не только отфильтровать, но и преобразовать данные на лету.

const messyArray = ['apple', '', 'banana', null, 'cherry', undefined, 'date', '  ', false, 0];

const cleanArray = messyArray.reduce((acc, item) => {
    // Условие: элемент не пустой и не falsy (кроме 0 и false, если нужно)
    if (item !== null && item !== undefined && item !== '' && String(item).trim() !== '') {
        acc.push(item);
    }
    return acc;
}, []);
// Результат: ['apple', 'banana', 'cherry', 'date', false, 0]

Преимущества reduce():

  • Можно легко добавить трансформацию элементов (например, привести к нижнему регистру)
  • Легко комбинировать с другими операциями (суммирование, группировка)

Недостаток: код получается более громоздким по сравнению с filter(). Для простой фильтрации filter() предпочтительнее.

Бонус: однострочник для самых частых случаев

const clean = arr.filter(x => x !== null && x !== undefined && x !== '');

Этот вариант удаляет null, undefined и пустые строки, но оставляет 0, false и строки с пробелами. Идеально для данных из форм, где пустая строка — это "ничего", а 0 — валидное значение.