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

Comment supprimer les éléments vides d'un tableau en JavaScript ?

Existe-t-il un moyen simple ou dois-je les parcourir en boucle et les supprimer manuellement ?

Solution

EDIT: Cette question a trouvé sa réponse il y a presque neuf ans, à l'époque où il n'y avait pas beaucoup de méthodes intégrées utiles dans le Array.prototype.

Maintenant, je vous recommande certainement d'utiliser la méthode filter.

Gardez à l'esprit que cette méthode vous retournera un nouveau tableau avec les éléments qui répondent aux critères de la fonction de rappel que vous lui fournissez.

Par exemple, si vous voulez enlever les valeurs null ou 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);

Cela dépendra de ce que vous considérez comme "vide" ; par exemple, si vous aviez affaire à des chaînes de caractères, la fonction ci-dessus ne supprimerait pas les éléments qui sont une chaîne vide.

Un modèle typique que je vois souvent utilisé est de supprimer les éléments qui sont falsy, qui incluent une chaîne vide "", 0, NaN, null, undefined, et false.

Vous pouvez passer à la méthode filter, à la fonction constructeur Boolean, ou retourner le même élément dans la fonction de critères de filtrage, par exemple :

var filtered = array.filter(Boolean);

Ou

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

Dans les deux cas, cela fonctionne parce que la méthode filter dans le premier cas, appelle le constructeur Boolean comme une fonction, convertissant la valeur, et dans le second cas, la méthode filter transforme en interne la valeur de retour du callback implicitement en Boolean.

Si vous travaillez avec des tableaux épars, et que vous essayez de vous débarrasser des "trous", vous pouvez utiliser la méthode filter en passant un callback qui renvoie true, par exemple :

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

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

Ancienne réponse: Ne faites pas ça !

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

Vous pouvez trouver plus facile de boucler sur votre tableau et de construire un nouveau tableau à partir des éléments que vous voulez garder du tableau que d'essayer de boucler et de coller comme cela a été suggéré, puisque modifier la longueur du tableau pendant qu'il est bouclé peut introduire des problèmes.

Vous pourriez faire quelque chose comme ceci :

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

En fait, voici une solution plus générique :

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]

Vous voyez l'idée - vous pourriez alors avoir d'autres types de fonctions de filtrage. C'est probablement plus que ce dont vous avez besoin, mais je me sentais généreux... ;)

[1] : https://stackoverflow.com/questions/281264/remove-empty-elements-from-an-array-in-javascript#281288

Commentaires (0)

Essayez ceci. Passez-lui votre tableau et il retournera avec les éléments vides supprimés. *Mise à jour pour corriger le bug signalé par Jason

function removeEmptyElem(ary) {
    for (var i = ary.length - 1; i >= 0; i--) {
        if (ary[i] == undefined)  {
            ary.splice(i, 1);
        }       
    }
    return ary;
}
Commentaires (5)