Question Supprimer les éléments vides d'un tableau en Javascript


Comment puis-je supprimer des éléments vides d'un tableau en JavaScript?

Y a-t-il un moyen simple, ou ai-je besoin de faire une boucle et de les retirer manuellement?


711
2017-11-11 15:48


origine


Réponses:


J'utilise cette méthode, en étendant le prototype natif 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);

Ou vous pouvez simplement pousser les éléments existants dans un autre tableau:

// 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,,,,]);

487
2017-11-11 16:12



Des moyens simples:

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

// (filter - JS 1.6 and above)
arr = arr.filter(function(n){ return n != undefined }); 

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

//or - (only for arrays items which are numbers is numbers' strings)**
arr = arr.filter(Number) // [1, 3, 3, 4, 4, 5, 6]

// ES6 style (Firefox FTW)
arr.filter(n => true) // [1, 2, 3, 3, null, 0, undefined, 4, 4, 5, 6]

// or if "null" values are to be removed:
arr.filter(n => n)

ou - (seulement pour unique éléments de tableau de type "texte")

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

ou - Méthode classique: itération simple

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]


via 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]


UPDATE - juste un autre moyen rapide et cool (en utilisant 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]

Supprimer les valeurs vides

['foo', '',, ' ', true, [], [1], {}, undefined].filter(String)

// ["foo", " ", true, [1], Object {}, undefined]

Supprimer les valeurs falsifiées

Une autre méthode qui supprime le "falsy" les valeurs de la chaîne vide "", 0 et undefined

[1, 2,, 3,, 3,undefined,,"",false,null,0,NaN, 4," ", 4,true, 5,, 6,,,,].filter(Boolean);

// [1, 2, 3, 3, 4, " ", 4, true, 5, 6]

1137
2017-10-28 01:41



Si vous devez supprimer TOUTES les valeurs vides ("", null, undefined et 0):

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

Pour supprimer les valeurs vides et les sauts de ligne:

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

Exemple:

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

Revenir:

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

MISE À JOUR (basé sur le commentaire d'Alnitak)

Dans certaines situations, vous voudrez peut-être garder "0" dans le tableau et enlever tout ce qui est différent (null, indéfini et ""), c'est une façon:

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

Revenir:

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

202
2017-12-10 09:25



Simplement un doublure:

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

ou en utilisant underscorejs.org:

_.filter([1, false, "", undefined, 2], Boolean); // [1, 2]
// or even:
_.compact([1, false, "", undefined, 2]); // [1, 2]

121
2017-11-11 16:29



Si vous avez Javascript 1.6 ou plus tard, vous pouvez utiliser Array.filter en utilisant un trivial return true fonction de rappel, par exemple:

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

depuis .filter saute automatiquement les éléments manquants dans le tableau d'origine.

La page MDN liée ci-dessus contient également une version de vérification d'erreur de filter Cela peut être utilisé dans les interpréteurs JavaScript qui ne supportent pas la version officielle.

Notez que cela ne supprimera pas null entrées ni entrées avec un explicit undefined valeur, mais le PO a spécifiquement demandé des entrées "manquantes".


108
2018-03-26 16:57



La façon propre de le faire.

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"]

46
2018-01-09 07:28



Pour supprimer les trous, vous devez utiliser

arr.filter(() => true)

Pour supprimer le trou, et, falsy (null, indéfini, 0, -0, NaN, "", faux, document.all) valeurs:

arr.filter(x => x)

Pour supprimer le trou, null, et, indéfini:

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]


36
2018-03-22 20:24



ES6 simple

['a','b','',,,'w','b'].filter(v => v);

23
2017-11-30 18:25



Avec Underscore / Lodash:

Cas d'utilisation générale:

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

Avec des vides:

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

Voir documentation lodash pour sans.


20
2017-12-19 18:57



Si l'utilisation d'une bibliothèque est une option, je sais que underscore.js a une fonction appelée compact () http://documentcloud.github.com/underscore/ il a également plusieurs autres fonctions utiles liées aux tableaux et aux collections.

Voici un extrait de leur documentation:

_.compact (tableau)

Renvoie une copie du tableau avec toutes les valeurs de la falsification supprimées. En JavaScript, false, null, 0, "", indéfini et NaN sont tous falsifiés.

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

=> [1, 2, 3]


15
2017-11-08 18:10



@Alnitak

En fait Array.filter fonctionne sur tous les navigateurs si vous ajoutez du code supplémentaire. Voir ci-dessous.

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"]  

C'est le code que vous devez ajouter pour IE, mais le filtre et la valeur de programmation fonctionnelle sont 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;
  };
}

14
2017-11-11 16:03