Удалить пустые элементы из массива в Javascript

1146

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

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

Тамас Чинеге
источник
14
Было бы полезно, если бы в вашем вопросе было точно указано, что вы подразумеваете под «пустыми элементами», поскольку большинство ответов здесь неверно истолковывают (ИМХО) значение «ложных» элементов. NB: есть разница между тем, что вы получаете var a = [,,]и var a = [undefined, undefined]. Первый действительно пустой, но последний на самом деле имеет два ключа, но со undefinedзначениями.
Альнитак

Ответы:

1066

РЕДАКТИРОВАТЬ: На этот вопрос был дан ответ почти девять лет назад, когда не было много полезных встроенных методов в 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,,,,]);
CMS
источник
110
ВНИМАНИЕ: 2-й вариант удалит все элементы из массива, который считается «ложным», т. Е. Значения false, 0, null & undefined. В этом массиве ничего не останется: [null ,,, 0,, ​​0,0,0, false, null, 0], хотя мне могут потребоваться элементы со значениями 0, как в этом массиве: [ 1,0,1,0,0,1]
Джейсон Бантинг
5
Я понимаю, что именно поэтому я говорил только о втором варианте. Что касается первого, он настолько узок по объему, что я не решусь сделать его частью прототипа массива. Смотрите ответ Альнитака на этой странице, чтобы найти что-то более идеальное. Ваш, конечно, учитывает цепочку.
Джейсон Бантинг
1
Ваше первое решение действительно хорошо, если у вас нет доступа к методу «фильтра». Иначе я считаю, что ответ Алнитак лучше.
Джо Пинеда
2
@AlfaTek - на всех, кроме новейших браузеров, # 2 будет иметь лучшую производительность, потому что массивы в JS на самом деле не являются массивами. spliceВызов действительно дорого на старых браузерах , потому что они должны пронумеровать все ключи массива , чтобы закрыть этот пробел.
Альнитак
1
@ Дэвид нет, в современном коде вы должны безопасно расширить Array.prototypeиспользование, Object.definePropertyчтобы сделать новую функцию неперечислимым свойством, а затем избегать снижения производительности, вызванного включением .hasOwnPropertyкаждого цикла.
Альнитак
1382

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

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;

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

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

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

// ["foo", null, " ", 3, true, [1], Object {}, undefined, ()=>{}]
vsync
источник
34
самая ранняя поддержка IE для фильтра - режим стандартов IE9.
yincrash
14
для чистого JavaScript это должно бытьarr = arr.filter(function(n){return n; });
ilumin
19
foo.join("").split("")Кажется, только работает, если строки состоят из одного символа
Atav32
9
В вашем чистом коде JavaScript есть ошибка. Если массив имеет значение с «0», это значение будет отфильтровано, потому что «0» является ложным. Что вам нужно: arr.filter (function (n) {return (n! == undefined && n! == null);});
Джон Курлак
5
ES6 может сделать это еще проще, arr.filter(e=>e)и это может быть связано с картой, уменьшением и т. Д.
Sheepy
242

Если вам нужно удалить ВСЕ пустые значения ("", 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});

Возвращение:

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

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

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

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

Возвращение:

["hello", 0, 1, 100, " "]
Лепе
источник
Да, это хорошо, потому что удаляет "", а также.
Владимир
3
Тестовая функция может быть немного более явной:function(e){return !!e}
Коен.
4
@Koen Пожалуйста, обратите внимание, что !!eбудет включать NaN (в отличие от 0), где eне будет (как 0).
Sheepy
На самом деле не отвечает на вопрос, который был задан.
Альнитак
2
ИЛИ var myarr=[1, 2,, 3,, 3,undefined,,"",,0, 4,, 4,, 5,, 6,,,,].filter(Boolean);удаляет неопределенные, "" и 0
Марк Schultheiss
134

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

[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]
andlrc
источник
1
Это действительно круто - у меня есть новый вопрос: похоже, вы используете имя класса в качестве вызова функции - это приведение типов? Я не видел этого раньше и не уверен, что понимаю, почему передача Booleanработает как функция ...
Эндрю
8
Если вы рассматриваете Booleanкак функцию, она просто вернет trueили falseукажет значение true / false.
andlrc
8
Вы не рассматриваете логическое значение как функцию; она является функцией. (Абсолютно нормальная функция, за исключением того, что она реализована изначально.) Кто-то должен немного изучить объектную модель JavaScript. ;)
ELLIOTTCABLE
@ELLIOTTCABLE Я просто оставлю это здесь (true).constructor === Boolean. А затем скажите мне, можем ли мы сделать это с другими встроенными модулями в JS. ;)) (конечно, исключены остальные 5 встроенных конструкторов. (String, Array, Object, Function, Number))
andlrc
1
Сбой обоих, если в массиве есть значение 0
Сай Рам
129

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

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

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

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

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

Альнитак
источник
Вы правы! Это может быть так просто, как это (и работает!): Test3 = [1,2,, 3,, 3 ,,,, 7 ,,, 7 ,,, 0 ,,, 4,, 4,, 5 ,, 6, неопределенные ,, нуль ,,]; printp («Использование собственной фильтрации массива:», test3.filter (function (value) {return (value == undefined)? 0: 1;}));
Джо Пинеда
3
+1 Как сказал Альнитак, у них есть код, который можно использовать в случае отсутствия js 1.6
Sameer Alibhai
3
@katsh Я уточнил - код выше делает работу для удаления записей , для которых значения не существует вообще, что (я впоследствии) узнал семантически отличается от случая ключа , который существует , но имеет в undefinedкачестве заданного значения.
Альнитак
4
Чтобы удалить неопределенные или нулевые записи, просто внесите небольшую модификацию ... arr = arr.filter (function (v) {return v;});
Алан CN
4
@AlanCN Вы полностью упустили мою точку зрения. ОП попросил удалить отсутствующие записи, в то время как основная часть ответов здесь (неправильно) удаляет все «ложные» записи.
Альнитак
65

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

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]

ТТГ
источник
3
Это должно быть высоко в ответе. Можете ли вы расширить то, что вы подразумеваете под отверстиями / отверстиями?
Самайо
2
@ samayo отверстия - это незаполненные элементы массива, т. е.[, ,]
Джимми Обонио Абор
Используя arr.filter(x => x)JS, проверим, является ли x истинным или ложным, т. Е. if (x), Следовательно, только новое значение будет присвоено новому списку.
КуанЮ Чу
56

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

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"]
Томас Сенарт
источник
5
Пустые элементы есть undefined; это в основном удаляет все ложные значения.
pimvdb
33

Простая ES6

['a','b','',,,'w','b'].filter(v => v);
ML13
источник
1
Это не работает [1, 'two', null, undefined, , NaN, false, true, 0].filter(v => v).
молния
22

С Подчеркиванием / 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 без .

c4urself
источник
Проблема с #compact заключается в том, что он удаляет все ложные значения. Поэтому, если ваш массив содержит 0 значений, они также будут удалены.
Самуэль Брандао
21

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

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

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

 const clearArray = arr.filter( i => i );
AmerllicA
источник
16

Если использование библиотеки является опцией, которую я знаю, в underscore.js есть функция compact () http://documentcloud.github.com/underscore/, а также несколько других полезных функций, связанных с массивами и коллекциями.

Вот выдержка из их документации:

_.compact (массив)

Возвращает копию массива со всеми ошибочными значениями. В JavaScript false, null, 0, "", undefined и NaN являются ложными.

_.compact ([0, 1, false, 2, '', 3]);

=> [1, 2, 3]

Луис Перес
источник
Он также удаляет непустые элементы, определенные элементы, такие как 0.
Тимоти Гу
15

@Alnitak

На самом деле Array.filter работает во всех браузерах, если вы добавите дополнительный код. См. ниже.

var array = ["","one",0,"",null,0,1,2,4,"two"];

function isempty(x){
if(x!=="")
    return true;
}
var res = array.filter(isempty);
document.writeln(res.toJSONString());
// gives: ["one",0,null,0,1,2,4,"two"]  

Это код, который нужно добавить для IE, но фильтрация и функциональное программирование стоят того же.

//This prototype is provided by the Mozilla foundation and
//is distributed under the MIT license.
//http://www.ibiblio.org/pub/Linux/LICENSES/mit.license

if (!Array.prototype.filter)
{
  Array.prototype.filter = function(fun /*, thisp*/)
  {
    var len = this.length;
    if (typeof fun != "function")
      throw new TypeError();

    var res = new Array();
    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this)
      {
        var val = this[i]; // in case fun mutates this
        if (fun.call(thisp, val, i, this))
          res.push(val);
      }
    }

    return res;
  };
}
Эрик Йоханссон
источник
Это должен быть принятый ответ, так как он работает из коробки. Огромное спасибо.
Тони
@ Тони нет, не должно, потому что элемент с пустой строкой не совпадает с «пустым элементом», последний из которых является тем, что запрашивал OP.
Альнитак
14

Так как никто другой не упомянул об этом, и большинство людей отметили, что в их проекте есть подчеркивание, вы также можете использовать его _.without(array, *values);.

_.without(["text", "string", null, null, null, "text"], null)
// => ["text", "string", "text"]
Джош Бедо
источник
12

ES6:

let newArr = arr.filter(e => e);
Канан Фарзали
источник
8

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

Вы могли бы сделать что-то вроде этого:

function removeFalsyElementsFromArray(someArray) {
    var newArray = [];
    for(var index = 0; index < someArray.length; index++) {
        if(someArray[index]) {
            newArray.push(someArray[index]);
        }
    }
    return newArray;
}

На самом деле вот более общее решение:

function removeElementsFromArray(someArray, filter) {
    var newArray = [];
    for(var index = 0; index < someArray.length; index++) {
        if(filter(someArray[index]) == false) {
            newArray.push(someArray[index]);
        }
    }
    return newArray;
}

// then provide one or more filter functions that will 
// filter out the elements based on some condition:
function isNullOrUndefined(item) {
    return (item == null || typeof(item) == "undefined");
}

// then call the function like this:
var myArray = [1,2,,3,,3,,,,,,4,,4,,5,,6,,,,];
var results = removeElementsFromArray(myArray, isNullOrUndefined);

// results == [1,2,3,3,4,4,5,6]

Вы поняли - у вас могут быть другие типы функций фильтра. Наверное, больше, чем нужно, но я чувствовал себя щедрым ...;)

Джейсон Бантинг
источник
7

Как насчет этого (ES6): удалить значение Falsy из массива.

var arr = [0,1,2,"test","false",false,true,null,3,4,undefined,5,"end"];

arr.filter((v) => (!!(v)==true));

//output:

//[1, 2, "test", "false", true, 3, 4, 5, "end"]
VIJAY P
источник
6

Вы должны использовать фильтр, чтобы получить массив без пустых элементов. Пример на ES6

const array = [1, 32, 2, undefined, 3];
const newArray = array.filter(arr => arr);
Гапур Касым
источник
3

Я просто добавить свой голос к вышесказанному «призыв ES5 - х Array..filter()с глобальным конструктора» гольф-хака, но я предлагаю использовать Objectвместо String, Booleanили , Numberкак было предложено выше.

В частности, ES5 filter()уже не запускает undefinedэлементы в массиве; поэтому функция, которая универсально возвращает true, которая возвращает всеfilter() попадания элементов , обязательно будет возвращать только не- undefinedэлементы:

> [1,,5,6,772,5,24,5,'abc',function(){},1,5,,3].filter(function(){return true})
[1, 5, 6, 772, 5, 24, 5, 'abc', function (){}, 1, 5, 3]

Тем не менее, написание ...(function(){return true;})длиннее, чем написание ...(Object); и возвращаемое значение Objectконструктора будет, при любых обстоятельствах , своего рода объектом. В отличие от конструкторов примитивного бокса, предложенных выше, ни одно из возможных значений объекта не является ложным, и, следовательно, в логической настройке Objectявляется сокращением function(){return true}.

> [1,,5,6,772,5,24,5,'abc',function(){},1,5,,3].filter(Object)
[1, 5, 6, 772, 5, 24, 5, 'abc', function (){}, 1, 5, 3]
ELLIOTTCABLE
источник
1
ВНИМАНИЕ: фильтр (String) и фильтр (Object) не отфильтровывают ноль или числа. Поскольку конструктор также является функцией, которую вы можете передать String для фильтрации, т. someArray.filter(String);Е. Фактически эквивалентен someArray.filter(function(x){ return String(x); });. Если вы хотите удалить все ложные значения, someArray.filter(Boolean);работает удаление 0, -0, NaN, false, '', null и undefined.
Робокат
1
Хороший ответ, хотя мне интересно, что производительность вызывает вызов Objectконструктора, а не return trueметода. @robocat ОП попросил удалить пустые элементы, а не нули.
Альнитак
Я предпочитаю самое короткое и ясное решение, за исключением узких петель. Личные предпочтения, я полагаю. (=
ELLIOTTCABLE
3

При использовании ответа с наибольшим количеством голосов, приведенного выше, в первом примере я получал отдельные символы для строк длиной более 1. Ниже приведено мое решение этой проблемы.

var stringObject = ["", "some string yay", "", "", "Other string yay"];
stringObject = stringObject.filter(function(n){ return n.length > 0});

Вместо того, чтобы не возвращать, если значение не определено, мы возвращаем, если длина больше 0. Надеюсь, это поможет кому-то там.

Возвращает

["some string yay", "Other string yay"]
Джон Миллер
источник
+1, так как это очень практично и именно то, что мне обычно нужно для работы со строковыми массивами, но имейте в виду, что это удаляет числа (если они не в строковой форме), так как у них нет длины. Таким образом, ["", "some string yay", "", "", 123, "Other string yay"].filter(function(n){ return n.length > 0}) //gives your same result removing 123замена этой функции. .. с String, по иронии судьбы, оставляет числа в, но даст тот же результат в вашем массиве.
aamarks
3
var data = [null, 1,2,3];
var r = data.filter(function(i){ return i != null; })

console.log(r) 

[1,2,3]

KARTHIKEYAN.A
источник
Это, очевидно, правильный способ сделать это и должен быть на вершине!
Мартин Андерссон
2

Что об этом:

js> [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,].filter(String).join(',')
1,2,3,3,0,4,4,5,6
JessyNinja
источник
6
join() === join(','):)
pimvdb
1

Это работает, я протестировал его в AppJet (вы можете скопировать и вставить код в его IDE и нажать «перезагрузить», чтобы увидеть, как он работает, не нужно создавать учетную запись)

/* appjet:version 0.1 */
function Joes_remove(someArray) {
    var newArray = [];
    var element;
    for( element in someArray){
        if(someArray[element]!=undefined ) {
            newArray.push(someArray[element]);
        }
    }
    return newArray;
}

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

print("Original array:", myArray2);
print("Clenased array:", Joes_remove(myArray2) );
/*
Returns: [1,2,3,3,0,4,4,5,6]
*/
Джо Пинеда
источник
1
Похоже, что это работает «случайно», поскольку именно перечисление ключей через них for ... inфактически приводит к пропуску пропущенных элементов. Тест undefinedслужит только для удаления реальных элементов, для которых явно задано это значение.
Альнитак
1

Другой способ сделать это - воспользоваться преимуществом свойства length массива: упаковать ненулевые элементы в «левом» массиве, а затем уменьшить длину. Это алгоритм на месте - он не выделяет память, что очень плохо для сборщика мусора, и он работает очень хорошо в наилучшем / среднем / худшем случаях.

Это решение, по сравнению с другими, в Chrome работает в 2–50 раз быстрее, а в Firefox - в 5–50 раз, как вы можете видеть здесь: http://jsperf.com/remove-null-items-from-array

Приведенный ниже код добавляет неперечислимый метод 'removeNull' в массив, который возвращает 'this' для последовательного подключения:

var removeNull = function() {
    var nullCount = 0           ;
    var length    = this.length ;
    for (var i=0, len=this.length; i<len; i++) { if (!this[i]) {nullCount++} }
    // no item is null
    if (!nullCount) { return this}
    // all items are null
    if (nullCount == length) { this.length = 0; return this }
    // mix of null // non-null
    var idest=0, isrc=length-1;
    length -= nullCount ;                
    while (true) {
         // find a non null (source) slot on the right
         while (!this[isrc])  { isrc--; nullCount--; } 
         if    (!nullCount) { break }       // break if found all null
         // find one null slot on the left (destination)
         while ( this[idest]) { idest++  }  
         // perform copy
         this[idest]=this[isrc];
         if (!(--nullCount)) {break}
         idest++;  isrc --; 
    }
    this.length=length; 
    return this;
};  

Object.defineProperty(Array.prototype, 'removeNull', 
                { value : removeNull, writable : true, configurable : true } ) ;
GameAlchemist
источник
Хороший ответ, хотя было бы неплохо увидеть несколько тестовых примеров, чтобы показать это в действии!
Альнитак
2
Этот ответ очень увлекателен, но напоминает мне взгляд на компьютер 1945 года постройки, когда у меня есть смартфон arr.filter(e => e).
agm1984
@ agm1984 твой смартфон не умный
Эрнан Эче
Это может зависеть от вашего определения - smartтакой как глагол, чтобы вызвать острую жгучую боль. Это актуально из-за физической боли, если я из-за вашего комментария пользуюсь телефоном.
agm1984
1
foo = [0, 1, 2, "", , false, 3, "four", null]

foo.filter(function(e) {
    return e === 0 ? '0' : e
})

возвращается

[0, 1, 2, 3, "four"]
sqram
источник
1

«Неправильное использование» цикла for ... in (object-member). => В теле цикла отображаются только истинные значения.

// --- Example ----------
var field = [];

field[0] = 'One';
field[1] = 1;
field[3] = true;
field[5] = 43.68;
field[7] = 'theLastElement';
// --- Example ----------

var originalLength;

// Store the length of the array.
originalLength = field.length;

for (var i in field) {
  // Attach the truthy values upon the end of the array. 
  field.push(field[i]);
}

// Delete the original range within the array so that
// only the new elements are preserved.
field.splice(0, originalLength);
michael.zech
источник
код правильный, комментарий неправильный. Акт использования for ... in- это то, что удаляет неопределенные ключи из массива, но у вас фактически нет здесь кода, чтобы в противном случае принимать только «истинные» значения
Альнитак
1

Это может помочь вам: https://lodash.com/docs/4.17.4#remove

var details = [
            {
                reference: 'ref-1',
                description: 'desc-1',
                price: 1
            }, {
                reference: '',
                description: '',
                price: ''
            }, {
                reference: 'ref-2',
                description: 'desc-2',
                price: 200
            }, {
                reference: 'ref-3',
                description: 'desc-3',
                price: 3
            }, {
                reference: '',
                description: '',
                price: ''
            }
        ];

        scope.removeEmptyDetails(details);
        expect(details.length).toEqual(3);

scope.removeEmptyDetails = function(details){
            _.remove(details, function(detail){
                return (_.isEmpty(detail.reference) && _.isEmpty(detail.description) && _.isEmpty(detail.price));
            });
        };
Сандип М
источник
1
var data= { 
    myAction: function(array){
        return array.filter(function(el){
           return (el !== (undefined || null || ''));
        }).join(" ");
    }
}; 
var string = data.myAction(["I", "am","", "working", "", "on","", "nodejs", "" ]);
console.log(string);

Вывод:

Я работаю над nodejs

Это удалит пустой элемент из массива и отобразит другой элемент.

Джитендра Вирани
источник
вывод: «Я работаю над nodejs». он удалит пустой элемент из массива и отобразит другой элемент.
Джитендра Вирани
Я улучшил ваш ответ. Пожалуйста, постарайтесь сделать простой, ясный и понятный ответ;)
GGO
1

Удаление всех пустых элементов

Если массив содержит пустые объекты, массивы и строки вместе с другими пустыми элементами, мы можем удалить их с помощью:

const arr = [ [], ['not', 'empty'], {}, { key: 'value' }, 0, 1, null, 2, "", "here", " ", 3, undefined, 3, , , , , , 4, , 4, , 5, , 6, , , ]

let filtered = JSON.stringify(
  arr.filter((obj) => {
    return ![null, undefined, ''].includes(obj)
  }).filter((el) => {
    return typeof el != "object" || Object.keys(el).length > 0
  })
)

console.log(JSON.parse(filtered))

Простое сжатие (удаление пустых элементов из массива)

С ES6:

const arr = [0, 1, null, 2, "", 3, undefined, 3, , , , , , 4, , 4, , 5, , 6, , , ,]

let filtered = arr.filter((obj) => { return ![null, undefined].includes(obj) })

console.log(filtered)

С простым Javascript ->

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

var filtered = arr.filter(function (obj) { return ![null, undefined].includes(obj) })

console.log(filtered)

Златко Аломерович
источник
0

Фильтрация недействительных записей с помощью регулярного выражения

array = array.filter(/\w/);
filter + regexp
lcabral
источник
Это работает? он показывает ошибку TypeError: [объект RegExp] не является функцией
FreeLightman
0

Лучший способ удалить пустые элементы, это использовать Array.prototype.filter(), как уже упоминалось в других ответах.

К сожалению, Array.prototype.filter()не поддерживается IE <9. Если вам все еще нужно поддерживать IE8 или даже более старую версию IE, вы можете использовать следующий polyfill для добавления поддержки Array.prototype.filter()в этих браузерах:

if (!Array.prototype.filter) {
  Array.prototype.filter = function(fun/*, thisArg*/) {
    'use strict';
    if (this === void 0 || this === null) {
      throw new TypeError();
    }
    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== 'function') {
      throw new TypeError();
    }
    var res = [];
    var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
    for (var i = 0; i < len; i++) {
      if (i in t) {
        var val = t[i];
        if (fun.call(thisArg, val, i, t)) {
          res.push(val);
        }
      }
    }
    return res;
  };
}
Джон Слегерс
источник