1222 votes

Comment supprimer un élément d'un tableau par valeur ?

Existe-t-il une méthode pour supprimer un élément d'un tableau JavaScript ?

Étant donné un tableau :

var ary = ['three', 'seven', 'eleven'];

Je voudrais faire quelque chose comme :

removeItem('seven', ary);

J'ai regardé dans splice() mais cela ne supprime que par le numéro de position, alors que j'ai besoin de quelque chose pour supprimer un élément par sa valeur.

95 votes

S'IL VOUS PLAÎT, UTILISEZ --> Array.filter()

0 votes

J'ai écrit plusieurs solutions pour cela (supprimer une ou plusieurs valeurs) et voici ma solution ultime (j'ai fait un benchmark et elle est plus rapide que lodash). Essayez-la : gist.github.com/ardeshireshghi/0d97db4ae09bc2f90609c536fc63c‌​648

2047voto

SLaks Points 391154

Vous pouvez utiliser le indexOf méthode comme ça :

var index = array.indexOf(item);
if (index !== -1) {
  array.splice(index, 1);
}

Note : Vous devrez le modifier pour IE8 et les versions inférieures.

var array = [1,2,3,4]
var item = 3

var index = array.indexOf(item);
array.splice(index, 1);

console.log(array)

75 votes

Et boucle dessus tant que l'index n'est pas -1

8 votes

Il serait préférable de faire une vérification pour ne faire qu'une épissure si elle est différente de celle de l'autre. -1 il y a des millions d'options, choisissez judicieusement. jsperf.com/not-vs-gt-vs-ge/4

33 votes

Si vous utilisez jquery, vous pouvez utiliser $.inArray au lieu de indexOf qui est compatible avec tous les navigateurs.

604voto

John Williams Points 769

Une seule phrase suffira,

var arr = ['three', 'seven', 'eleven'];

// Remove item 'seven' from array
var filteredArray = arr.filter(function(e) { return e !== 'seven' })
//=> ["three", "eleven"]

// In ECMA6 (arrow function syntax):
var filteredArray = arr.filter(e => e !== 'seven')

Cela permet d'utiliser le filtre en JS. Elle est prise en charge par IE9 et les versions ultérieures.

Ce qu'il fait (d'après le lien vers le document)

filter() appelle une fonction callback fournie une fois pour chaque élément d'un tableau, et construit un nouveau tableau de toutes les valeurs pour lesquelles callback retourne une valeur qui coïncide avec true. callback n'est invoquée que pour les index du tableau qui ont des valeurs assignées ; elle n'est pas invoquée pour les index qui ont été supprimés ou qui n'ont jamais eu de valeurs assignées. Les éléments du tableau qui ne passent pas le test de callback sont simplement ignorés, et ne sont pas inclus dans le nouveau tableau.

Donc, fondamentalement, c'est la même chose que tous les autres for (var key in ary) { ... } sauf que les for in La construction est prise en charge à partir d'IE6.

Fondamentalement, le filtre est une méthode de commodité qui a un aspect beaucoup plus agréable (et qui peut être enchaînée) par rapport à l'option for in construire (AFAIK).

8 votes

Je m'étonne que cette merveilleuse réplique ne reçoive pas plus d'amour. +1 Pas de boucles. On peut ajouter autant de valeurs que l'on veut supprimer en utilisant && pour les valeurs.

0 votes

@bamboon La fonction de filtre vérifie si un élément répond aux critères. La fonction est exécutée avec chaque élément, un par un, et lors du retour de la fonction, la réponse est la suivante true le tableau résultant conservera l'élément. Il est omis sur false .

0 votes

Probablement parce que certains d'entre nous doivent encore supporte IE8 Ce qui exclut également son utilisation avec la version 5.8 de l'hôte Windows script, par exemple, sans polyfill. Argh. ;^)

552voto

kennebec Points 33886

Il peut s'agir d'une fonction globale ou d'une méthode d'un objet personnalisé, si vous n'êtes pas autorisé à ajouter des prototypes natifs. Elle supprime tous les éléments du tableau qui correspondent à l'un des arguments.

Array.prototype.remove = function() {
    var what, a = arguments, L = a.length, ax;
    while (L && this.length) {
        what = a[--L];
        while ((ax = this.indexOf(what)) !== -1) {
            this.splice(ax, 1);
        }
    }
    return this;
};

var ary = ['three', 'seven', 'eleven'];

ary.remove('seven');

/*  returned value: (Array)
three,eleven
*/

Pour qu'il devienne mondial

function removeA(arr) {
    var what, a = arguments, L = a.length, ax;
    while (L > 1 && arr.length) {
        what = a[--L];
        while ((ax= arr.indexOf(what)) !== -1) {
            arr.splice(ax, 1);
        }
    }
    return arr;
}
var ary = ['three', 'seven', 'eleven'];
removeA(ary, 'seven');

/*  returned value: (Array)
three,eleven
*/

Et pour s'occuper d'IE8 et moins

if(!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(what, i) {
        i = i || 0;
        var L = this.length;
        while (i < L) {
            if(this[i] === what) return i;
            ++i;
        }
        return -1;
    };
}

0 votes

Je me demande juste si je dois inclure la librairie prototypeJS dans mon projet pour utiliser votre suggestion ou si elle est incluse dans tous les navigateurs ?

5 votes

@xorinzor Non, la propriété .prototype est multi-navigateurs.

184 votes

Ne changez jamais le prototype d'Array. De drôles de choses commencent à se produire.

145voto

vatsal Points 610

Vous pouvez utiliser underscore.js . Cela rend les choses vraiment simples.

Par exemple, avec ceci :

var result = _.without(['three','seven','eleven'], 'seven');

Et result será ['three','eleven'] .

Dans votre cas, le code que vous devrez écrire est le suivant :

ary = _.without(ary, 'seven')

Il réduit le code que vous écrivez.

17 votes

Je n'ai jamais dit de ne pas utiliser la bibliothèque dans d'autres endroits. Si le code est plus propre, cela ne me dérange pas d'inclure une bibliothèque. Pourquoi les gens utilisent-ils jquery, pourquoi ne pas utiliser le javascript brut alors ?

11 votes

@vatsal - parce que les développeurs de bibliothèques peuvent se concentrer sur la rapidité, la concision et l'interfaçage des fonctions de leurs bibliothèques, tandis que je peux me concentrer sur mon application et son objectif. Cela me permet de gagner du temps de réflexion, ce qui me laisse du temps supplémentaire pour améliorer l'application et ne pas me soucier des petites fonctions qui la composent. Quelqu'un a déjà inventé la roue, pourquoi faudrait-il la refaire à chaque fois qu'on construit une voiture ?

11 votes

Bonjour Kelvin, je suis tout à fait d'accord avec vous. Une personne avait mis un commentaire et l'a retiré plus tard, il disait que l'utilisation de bibliothèques comme underscore n'est pas cool et que nous ne devrions pas accepter de telles réponses. J'ai essayé de lui répondre.

55voto

jBaron Points 386

Vérifiez de cette façon :

for(var i in array){
    if(array[i]=='seven'){
        array.splice(i,1);
        break;
    }
}

et dans une fonction :

function removeItem(array, item){
    for(var i in array){
        if(array[i]==item){
            array.splice(i,1);
            break;
        }
    }
}

removeItem(array, 'seven');

19 votes

Gardez à l'esprit que si vous modifiez ce code pour qu'il ne soit pas "cassé" et continue à boucler pour supprimer plusieurs éléments, vous devrez recalculer la variable i juste après la séparation, comme suit : i--. C'est parce que vous venez de réduire le tableau et que vous finirez par sauter un élément autrement.

4 votes

Pour ajouter à mon commentaire ci-dessus, le code serait alors : for (var i = 0 ; i < array.length ; i++) {/*etc...*/ array.splice(i,1) ; i-- ;

0 votes

Bonjour... Question, comment supprimer un tableau multiple ? J'ai essayé removeItem(array, 'seven, eight') mais ça ne marche pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X