web-dev-qa-db-fra.com

Comment parcourir un tableau et supprimer des éléments en JavaScript

J'ai un tableau d'éléments et j'ai besoin d'en supprimer certains. Le problème est que JavaScript ne semble pas avoir de boucle pour chaque boucle et que si j'utilise une boucle for, je rencontre des problèmes avec elle qui essaie essentiellement de vérifier des éléments au-delà des limites du tableau ou des éléments manquants dans le tableau car les index changent. . Laissez-moi vous montrer ce que je veux dire:

var elements = [1, 5, 5, 3, 5, 2, 4];
for(var i = 0; i < elements.length; i++){
    if(elements[i] == 5){
        elements.splice(i, 1);
    }
}

Le problème est que lorsque les éléments [1] sont supprimés, les éléments [2] deviennent des éléments [1]. Le premier problème est que certains éléments ne sont jamais examinés. L’autre problème est que .length change et si je codais de manière stricte les limites, je pourrais alors essayer d’examiner des éléments au-delà des limites du tableau. Alors, quelle est la meilleure façon de faire cette chose incroyablement simple?

67
Captain Stack

Commencez par le haut!

var elements = [1, 5, 5, 3, 5, 2, 4];
for(var i = elements.length -1; i >= 0 ; i--){
    if(elements[i] == 5){
        elements.splice(i, 1);
    }
}
151

Vous pouvez utiliser la méthode filter ici:

var elements = [1, 5, 5, 3, 5, 2, 4].filter(function(a){return a !== 5;});
//=> elements now [1,3,2,4]

Ou si vous ne voulez pas toucher elements:

var elementsfiltered
   ,elements = [1, 5, 5, 3, 5, 2, 4]
                .filter( function(a){if (a!==5) this.Push(a); return true;},
                         elementsfiltered = [] );
   //=> elementsfiltered = [1,3,2,4], elements = [1, 5, 5, 3, 5, 2, 4]

Voir Documentation MDN pour filter

Sinon, vous pouvez étendre le Array.prototype

Array.prototype.remove = Array.prototype.remove || function(val){
    var i = this.length;
    while(i--){
        if (this[i] === val){
            this.splice(i,1);
        }
    }
};
var elements = [1, 5, 5, 3, 5, 2, 4];
elements.remove(5);
//=> elements now [1,3,2,4]
30
KooiInc
var elements = [1, 5, 5, 3, 5, 2, 4];    
var i = elements.length;
while (i--) {
    if (elements[i] == 5) {
        elements.splice(i, 1);
    }
}
console.log(elements);
5
rouble

Vous pouvez simplement décrémenter i chaque fois que vous supprimez un élément.

var elements = [1, 5, 5, 3, 5, 2, 4];

var l = elements.length;
for(var i = 0; i < l; i++){
    if(elements[i] == 5){
        elements.splice(i, 1);
        i--;
    }
}

console.log(elements);
1
Lachmanski

Utiliser Array.shift () :

var array = [1, 2, 3, 'a', 'b', 'c'];
while (array.length > 0) {
  console.log(array.shift());
}

Edit: Ne correspond probablement pas aux spécifications. J'ai mal interprété la question (seulement supprimer certains éléments ) et je suis trop impatient d'ajouter une méthode qui n'a pas encore été mentionnée ...

1
Geert

Voici un exemple d'utilisation de Array.indexOf , while et Array.splice pour supprimer des éléments en ligne.

var elements = [1, 5, 5, 3, 5, 2, 4];
var remove = 5;
var index = elements.indexOf(remove);

while (index !== -1) {
    elements.splice(index, 1);
    index = elements.indexOf(remove);
}

console.log(elements);

Sur jsfiddle

0
Xotic750