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

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

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

Ответы [ 39 ]

15 голосов
/ 19 декабря 2011

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

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

_. Compact (array)

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

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

=> [1, 2, 3]

14 голосов
/ 19 марта 2009

@ Альнитак

На самом деле 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, но фильтрация и функциональное программирование стоят imo.

//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;
  };
}
13 голосов
/ 08 ноября 2014

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

_.without(["text", "string", null, null, null, "text"], null)
// => ["text", "string", "text"]
8 голосов
/ 11 ноября 2008

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

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

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]

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

6 голосов
/ 11 декабря 2015

Как насчет этого (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"]

6 голосов
/ 10 июля 2018
ES6: let newArr = arr.filter(e => e);
6 голосов
/ 28 декабря 2017

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

const array = [1, 32, 2, undefined, 3];
const newArray = array.filter(arr => arr);
3 голосов
/ 27 ноября 2012

Я просто добавляю свой голос к вышеупомянутому «вызову ES5's 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]
3 голосов
/ 22 октября 2014

При использовании ответа с наибольшим количеством голосов, приведенного выше, в первом примере я получал отдельные символы для строк длиной более 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"]
3 голосов
/ 29 марта 2017
var data = [null, 1,2,3];
var r = data.filter(function(i){ return i != null; })

console.log(r) 

[1,2,3]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...