Как удалить пустые элементы из массива в JavaScript?
Есть ли простой способ, или мне нужно пройти через него и удалить их вручную?
javascript
arrays
node.js
Тамас Чинеге
источник
источник
var a = [,,]
иvar a = [undefined, undefined]
. Первый действительно пустой, но последний на самом деле имеет два ключа, но соundefined
значениями.Ответы:
РЕДАКТИРОВАТЬ: На этот вопрос был дан ответ почти девять лет назад, когда не было много полезных встроенных методов в
Array.prototype
.Теперь, конечно, я бы порекомендовал вам использовать
filter
метод.Помните, что этот метод вернет вам новый массив с элементами, которые соответствуют критериям функции обратного вызова, которую вы ему предоставляете.
Например, если вы хотите удалить
null
илиundefined
значения:Это будет зависеть от того, что вы считаете «пустым», например, если вы имели дело со строками, вышеуказанная функция не удалит элементы, которые являются пустой строкой.
Один типичный образец , который я вижу часто используется для удаления элементов , которые являются falsy , которые включают в пустую строку
""
,0
,NaN
,null
,undefined
, иfalse
.Вы можете перейти к
filter
методу,Boolean
функции конструктора или вернуть тот же элемент в функции критериев фильтрации, например:Или
В обоих случаях это работает, потому что
filter
метод в первом случае вызываетBoolean
конструктор как функцию, преобразуя значение, а во втором случаеfilter
метод внутренне преобразует возвращаемое значение обратного вызова неявноBoolean
.Если вы работаете с разреженными массивами и пытаетесь избавиться от «дыр», вы можете использовать
filter
метод, передающий обратный вызов, который возвращает true, например:Старый ответ: не делай этого!
Я использую этот метод, расширяя собственный прототип Array:
Или вы можете просто вставить существующие элементы в другой массив:
источник
splice
Вызов действительно дорого на старых браузерах , потому что они должны пронумеровать все ключи массива , чтобы закрыть этот пробел.Array.prototype
использование,Object.defineProperty
чтобы сделать новую функцию неперечислимым свойством, а затем избегать снижения производительности, вызванного включением.hasOwnProperty
каждого цикла.Простые способы:
или - (только для отдельных элементов массива типа «текст»)
или - Классический способ: простая итерация
через JQuery:
ОБНОВЛЕНИЕ - просто еще один быстрый, крутой способ (с использованием ES6):
Удалить пустые значения
источник
arr = arr.filter(function(n){return n; });
foo.join("").split("")
Кажется, только работает, если строки состоят из одного символаarr.filter(e=>e)
и это может быть связано с картой, уменьшением и т. Д.Если вам нужно удалить ВСЕ пустые значения ("", null, undefined и 0):
Чтобы удалить пустые значения и разрывы строк:
Пример:
Возвращение:
ОБНОВЛЕНИЕ (на основе комментария Алнитак)
В некоторых ситуациях вы можете захотеть сохранить «0» в массиве и удалить все остальное (null, undefined и «»), это один из способов:
Возвращение:
источник
function(e){return !!e}
!!e
будет включать NaN (в отличие от 0), гдеe
не будет (как 0).var myarr=[1, 2,, 3,, 3,undefined,,"",,0, 4,, 4,, 5,, 6,,,,].filter(Boolean);
удаляет неопределенные, "" и 0Просто один лайнер:
или используя underscorejs.org :
источник
Boolean
работает как функция ...Boolean
как функцию, она просто вернетtrue
илиfalse
укажет значение true / false.(true).constructor === Boolean
. А затем скажите мне, можем ли мы сделать это с другими встроенными модулями в JS. ;)) (конечно, исключены остальные 5 встроенных конструкторов. (String, Array, Object, Function, Number))Если у вас есть Javascript 1.6 или более поздней версии, вы можете использовать
Array.filter
тривиальнуюreturn true
функцию обратного вызова, например:так как
.filter
автоматически пропускает отсутствующие элементы в исходном массиве.Страница MDN, ссылка на которую приведена выше, также содержит хорошую версию для проверки ошибок,
filter
которую можно использовать в интерпретаторах JavaScript, которые не поддерживают официальную версию.Обратите внимание, что это не удалит
null
ни записи, ни записи с явнымundefined
значением, но OP специально запросил «пропущенные» записи.источник
undefined
качестве заданного значения.Для удаления дырок следует использовать
Для удаления значений отверстия и ложных значений (null, undefined, 0, -0, NaN, "", false, document.all):
Для удаления отверстия, нуля и неопределенного:
источник
[, ,]
arr.filter(x => x)
JS, проверим, является ли x истинным или ложным, т. Е.if (x)
, Следовательно, только новое значение будет присвоено новому списку.Чистый способ сделать это.
источник
undefined
; это в основном удаляет все ложные значения.Простая ES6
источник
[1, 'two', null, undefined, , NaN, false, true, 0].filter(v => v)
.С Подчеркиванием / Lodash:
Общий случай использования:
С тарами:
Смотрите документацию по lodash без .
источник
Просто
ES6
и более новые версии метода, предположим, массив ниже:Простой способ:
источник
Если использование библиотеки является опцией, которую я знаю, в underscore.js есть функция compact () http://documentcloud.github.com/underscore/, а также несколько других полезных функций, связанных с массивами и коллекциями.
Вот выдержка из их документации:
источник
@Alnitak
На самом деле Array.filter работает во всех браузерах, если вы добавите дополнительный код. См. ниже.
Это код, который нужно добавить для IE, но фильтрация и функциональное программирование стоят того же.
источник
Так как никто другой не упомянул об этом, и большинство людей отметили, что в их проекте есть подчеркивание, вы также можете использовать его
_.without(array, *values);
.источник
ES6:
источник
Возможно, вам будет проще зациклить ваш массив и создать новый массив из элементов, которые вы хотите сохранить из массива, чем пытаться зацикливать и склеивать, как это было предложено, поскольку изменение длины массива во время его зацикливания может привести к проблемам.
Вы могли бы сделать что-то вроде этого:
На самом деле вот более общее решение:
Вы поняли - у вас могут быть другие типы функций фильтра. Наверное, больше, чем нужно, но я чувствовал себя щедрым ...;)
источник
Как насчет этого (ES6): удалить значение Falsy из массива.
источник
Вы должны использовать фильтр, чтобы получить массив без пустых элементов. Пример на ES6
источник
Я просто добавить свой голос к вышесказанному «призыв ES5 - х
Array..filter()
с глобальным конструктора» гольф-хака, но я предлагаю использоватьObject
вместоString
,Boolean
или ,Number
как было предложено выше.В частности, ES5
filter()
уже не запускаетundefined
элементы в массиве; поэтому функция, которая универсально возвращаетtrue
, которая возвращает всеfilter()
попадания элементов , обязательно будет возвращать только не-undefined
элементы:Тем не менее, написание
...(function(){return true;})
длиннее, чем написание...(Object)
; и возвращаемое значениеObject
конструктора будет, при любых обстоятельствах , своего рода объектом. В отличие от конструкторов примитивного бокса, предложенных выше, ни одно из возможных значений объекта не является ложным, и, следовательно, в логической настройкеObject
является сокращениемfunction(){return true}
.источник
someArray.filter(String);
Е. Фактически эквивалентенsomeArray.filter(function(x){ return String(x); });
. Если вы хотите удалить все ложные значения,someArray.filter(Boolean);
работает удаление 0, -0, NaN, false, '', null и undefined.Object
конструктора, а неreturn true
метода. @robocat ОП попросил удалить пустые элементы, а не нули.При использовании ответа с наибольшим количеством голосов, приведенного выше, в первом примере я получал отдельные символы для строк длиной более 1. Ниже приведено мое решение этой проблемы.
Вместо того, чтобы не возвращать, если значение не определено, мы возвращаем, если длина больше 0. Надеюсь, это поможет кому-то там.
Возвращает
источник
["", "some string yay", "", "", 123, "Other string yay"].filter(function(n){ return n.length > 0}) //gives your same result removing 123
замена этой функции. .. с String, по иронии судьбы, оставляет числа в, но даст тот же результат в вашем массиве.источник
Что об этом:
источник
join() === join(',')
:)Это работает, я протестировал его в AppJet (вы можете скопировать и вставить код в его IDE и нажать «перезагрузить», чтобы увидеть, как он работает, не нужно создавать учетную запись)
источник
for ... in
фактически приводит к пропуску пропущенных элементов. Тестundefined
служит только для удаления реальных элементов, для которых явно задано это значение.Другой способ сделать это - воспользоваться преимуществом свойства length массива: упаковать ненулевые элементы в «левом» массиве, а затем уменьшить длину. Это алгоритм на месте - он не выделяет память, что очень плохо для сборщика мусора, и он работает очень хорошо в наилучшем / среднем / худшем случаях.
Это решение, по сравнению с другими, в Chrome работает в 2–50 раз быстрее, а в Firefox - в 5–50 раз, как вы можете видеть здесь: http://jsperf.com/remove-null-items-from-array
Приведенный ниже код добавляет неперечислимый метод 'removeNull' в массив, который возвращает 'this' для последовательного подключения:
источник
arr.filter(e => e)
.smart
такой как глагол, чтобы вызвать острую жгучую боль. Это актуально из-за физической боли, если я из-за вашего комментария пользуюсь телефоном.возвращается
источник
«Неправильное использование» цикла for ... in (object-member). => В теле цикла отображаются только истинные значения.
источник
for ... in
- это то, что удаляет неопределенные ключи из массива, но у вас фактически нет здесь кода, чтобы в противном случае принимать только «истинные» значенияЭто может помочь вам: https://lodash.com/docs/4.17.4#remove
источник
Вывод:
Это удалит пустой элемент из массива и отобразит другой элемент.
источник
Удаление всех пустых элементов
Если массив содержит пустые объекты, массивы и строки вместе с другими пустыми элементами, мы можем удалить их с помощью:
Простое сжатие (удаление пустых элементов из массива)
С ES6:
С простым Javascript ->
источник
Фильтрация недействительных записей с помощью регулярного выражения
источник
Лучший способ удалить пустые элементы, это использовать
Array.prototype.filter()
, как уже упоминалось в других ответах.К сожалению,
Array.prototype.filter()
не поддерживается IE <9. Если вам все еще нужно поддерживать IE8 или даже более старую версию IE, вы можете использовать следующий polyfill для добавления поддержкиArray.prototype.filter()
в этих браузерах:источник