Удалить пустые элементы из массива в Javascript - PullRequest
901 голосов
/ 11 ноября 2008

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

Есть простой способ или мне нужно пройти через него и удалить их вручную?

Ответы [ 39 ]

1252 голосов
/ 16 мая 2010

Простые способы:

var arr = [1,2,,3,,-3,null,,0,,undefined,4,,4,,5,,6,,,,];


arr.filter(n => n)
// [1, 2, 3, -3, 4, 4, 5, 6]

arr.filter(Number) 
// [1, 2, 3, -3, 4, 4, 5, 6]

arr.filter(Boolean) 
// [1, 2, 3, -3, 4, 4, 5, 6]

или - (только для одиночных элементов массива типа "текст")

['','1','2',3,,'4',,undefined,,,'5'].join('').split(''); 
// output:  ["1","2","3","4","5"]

или - Классический способ: простая итерация

var arr = [1,2,null, undefined,3,,3,,,0,,,[],,{},,5,,6,,,,],
    len = arr.length, i;

for(i = 0; i < len; i++ )
    arr[i] && arr.push(arr[i]);  // copy non-empty values to the end of the array

arr.splice(0 , len);  // cut the array and leave only the non-empty values

arr // [1,2,3,3,[],Object{},5,6]


через JQuery:

var arr = [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,];

arr = $.grep(arr,function(n){ return n == 0 || n });

arr // [1, 2, 3, 3, 0, 4, 4, 5, 6]


ОБНОВЛЕНИЕ - просто еще один быстрый, крутой способ (с использованием ES6):

var arr = [1,2,null, undefined,3,,3,,,0,,,4,,4,,5,,6,,,,], 
    temp = [];

for(let i of arr)
    i && temp.push(i); // copy each non-empty value to the 'temp' array

arr = temp;
delete temp; // discard the variable

arr // [1, 2, 3, 3, 4, 4, 5, 6]

Удалить пустые значения

['foo', '',,,'',,null, ' ', 3, true, [], [1], {}, undefined, ()=>{}].filter(String)

// ["foo", null, " ", 3, true, [1], Object {}, undefined, ()=>{}]
723 голосов
/ 11 ноября 2008

РЕДАКТИРОВАТЬ: На этот вопрос ответили почти 9 лет назад, когда в Array.prototype.

не было много полезных встроенных методов.

Теперь, безусловно, я бы порекомендовал вам использовать метод filter.

Помните, что этот метод вернет вам новый массив с элементами, которые соответствуют критериям функции обратного вызова, которую вы ему предоставляете, например, если вы хотите удалить null или undefined значения:

var array = [0, 1, null, 2, "", 3, undefined, 3,,,,,, 4,, 4,, 5,, 6,,,,];

var filtered = array.filter(function (el) {
  return el != null;
});

console.log(filtered);

Это будет зависеть от того, что вы считаете «пустым», например, если вы имели дело со строками, вышеуказанная функция не удалит элементы, которые являются пустой строкой.

Один из часто встречающихся шаблонов, который я часто использую, состоит в удалении элементов falsy , которые содержат пустую строку "", 0, NaN, null, undefined и false.

Вы можете просто перейти к методу filter, функции конструктора Boolean или просто вернуть тот же элемент в функции критериев фильтрации, например:

var filtered = array.filter(Boolean);

Или

var filtered = array.filter(function(el) { return el; });

В обоих случаях это работает, потому что метод filter в первом случае вызывает конструктор Boolean как функцию, преобразуя значение, а во втором случае метод filter внутренне преобразует возвращаемое значение обратный вызов неявно к Boolean.

Если вы работаете с разреженными массивами и пытаетесь избавиться от «дыр», вы можете просто использовать метод filter, передавая обратный вызов, который возвращает true, например:

var sparseArray = [0, , , 1, , , , , 2, , , , 3],
    cleanArray = sparseArray.filter(function () { return true });

console.log(cleanArray); // [ 0, 1, 2, 3 ]

Старый ответ: Не делай этого!

Я использую этот метод, расширяя собственный прототип Array:

Array.prototype.clean = function(deleteValue) {
  for (var i = 0; i < this.length; i++) {
    if (this[i] == deleteValue) {         
      this.splice(i, 1);
      i--;
    }
  }
  return this;
};

test = new Array("", "One", "Two", "", "Three", "", "Four").clean("");
test2 = [1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,];
test2.clean(undefined);

Или вы можете просто вставить существующие элементы в другой массив:

// Will remove all falsy values: undefined, null, 0, false, NaN and "" (empty string)
function cleanArray(actual) {
  var newArray = new Array();
  for (var i = 0; i < actual.length; i++) {
    if (actual[i]) {
      newArray.push(actual[i]);
    }
  }
  return newArray;
}

cleanArray([1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,]);
221 голосов
/ 28 октября 2011

Если вам нужно удалить ВСЕ пустые значения ("", null, undefined и 0):

arr = arr.filter(function(e){return e}); 

Чтобы удалить пустые значения и разрывы строк:

arr = arr.filter(function(e){ return e.replace(/(\r\n|\n|\r)/gm,"")});

Пример:

arr = ["hello",0,"",null,undefined,1,100," "]  
arr.filter(function(e){return e});

Return:

["hello", 1, 100, " "]

ОБНОВЛЕНИЕ (на основе комментария Альнитака)

В некоторых ситуациях вы можете захотеть сохранить «0» в массиве и удалить все остальное (null, undefined и «»), это один из способов:

arr.filter(function(e){ return e === 0 || e });

Return:

["hello", 0, 1, 100, " "]
128 голосов
/ 10 декабря 2012

Просто один лайнер:

[1, false, "", undefined, 2].filter(Boolean); // [1, 2]

или используя underscorejs.org :

_.filter([1, false, "", undefined, 2], Boolean); // [1, 2]
// or even:
_.compact([1, false, "", undefined, 2]); // [1, 2]
117 голосов
/ 11 ноября 2008

Если у вас есть Javascript 1.6 или более поздней версии, вы можете использовать Array.filter, используя тривиальную return true функцию обратного вызова, например ::

arr = arr.filter(function() { return true; });

, поскольку .filter автоматически пропускает отсутствующие элементы в исходном массиве.

Страница MDN, ссылка на которую приведена выше, также содержит хорошую версию filter для проверки ошибок, которую можно использовать в интерпретаторах JavaScript, которые не поддерживают официальную версию.

Обратите внимание, что это не приведет к удалению null записей или записей с явным значением undefined, но OP специально запросил "пропущенные" записи.

55 голосов
/ 09 января 2018

Для удаления дырок следует использовать

arr.filter(() => true)
arr.flat(0) // Currently stage 3, check compatibility before using this

Для удаления значений отверстия и ложных значений (null, undefined, 0, -0, NaN, "", false, document.all):

arr.filter(x => x)

Для удаления отверстия, нуля и неопределенного значения:

arr.filter(x => x != null)

arr = [, null, (void 0), 0, -0, NaN, false, '', 42];
console.log(arr.filter(() => true)); // [null, (void 0), 0, -0, NaN, false, '', 42]
console.log(arr.filter(x => x)); // [42]
console.log(arr.filter(x => x != null)); // [0, -0, NaN, false, "", 42]
52 голосов
/ 26 марта 2011

Чистый способ сделать это.

var arr = [0,1,2,"Thomas","false",false,true,null,3,4,undefined,5,"end"];
arr = arr.filter(Boolean);
// [1, 2, "Thomas", "false", true, 3, 4, 5, "end"]
31 голосов
/ 22 марта 2017

Простой ES6

['a','b','',,,'w','b'].filter(v => v);
20 голосов
/ 30 ноября 2012

с подчеркиванием / Lodash:

Общий случай использования:

_.without(array, emptyVal, otherEmptyVal);
_.without([1, 2, 1, 0, 3, 1, 4], 0, 1);

с пустой тары:

_.without(['foo', 'bar', '', 'baz', '', '', 'foobar'], '');
--> ["foo", "bar", "baz", "foobar"]

См. документацию по lodash без .

15 голосов
/ 16 октября 2018

Просто ES6 и метод более новых версий, предположим, что массив ниже:

 const arr = [1,2,3,undefined,4,5,6,undefined,7,8,undefined,undefined,0,9];

Простой способ:

 const clearArray = arr.filter( i => i );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...