189 votes

Recherche et suppression d'une chaîne dans un tableau en javascript ?

Je l'ai fait :

var array = new Array();
array.push("A");
array.push("B");
array.push("C");

Je veux être capable de faire quelque chose comme :

array.remove("B");

mais il n'y a pas de fonction de suppression. Comment faire ?

5 votes

Une combinaison de .indexOf() y .splice() devrait faire l'affaire. Ou peut-être, alternativement, .filter() .

1 votes

0 votes

298voto

Tyrannas Points 706

Je suis en train de mettre à jour ce fil de discussion avec une solution plus récente d'une ligne :

let arr = ['A', 'B', 'C'];
arr = arr.filter(e => e !== 'B'); // will return ['A', 'C']

L'idée est de filtrer le tableau en sélectionnant tous les éléments différents de celui que vous voulez supprimer.

Note : supprimera toutes les occurrences.

EDIT :

Si vous voulez supprimer uniquement la première occurrence :

t = ['A', 'B', 'C', 'B'];
t.splice(t.indexOf('B'), 1); // will return ['B'] and t is now equal to ['A', 'C', 'B']

1 votes

Cette solution renvoie une copie du tableau, alors que l'utilisation de splice supprime le ou les éléments en place. La solution que vous choisissez dépend du contexte.

7 votes

C'est parfait pour les trucs Redux où vous devez retourner un nouvel état.

0 votes

@Regis En fait non, arr.filter retourne un nouveau tableau. Donc arr.filter(e => e!== 'B') ne modifiera pas arr. Ou peut-être que je n'ai pas bien compris votre commentaire ?

173voto

Rob W Points 125904

Parcourez la liste en boucle dans l'ordre inverse, et utilisez la fonction .splice méthode.

var array = ['A', 'B', 'C']; // Test
var search_term = 'B';

for (var i=array.length-1; i>=0; i--) {
    if (array[i] === search_term) {
        array.splice(i, 1);
        // break;       //<-- Uncomment  if only the first term has to be removed
    }
}

L'ordre inverse est important lorsque tous les occurrences du terme de recherche doivent être supprimées. Sinon, le compteur augmentera, et vous sauterez des éléments.

Lorsque seule la première occurrence doit être supprimée, la méthode suivante fonctionne également :

var index = array.indexOf(search_term);    // <-- Not supported in <IE9
if (index !== -1) {
    array.splice(index, 1);
}

1 votes

Je suppose que c'est parce qu'il est censé être légèrement plus rapide d'itérer en sens inverse.

1 votes

@BenClayton : Merci. FWIW, en JavaScript, ce n'est pas vrai de manière fiable. Le décompte jusqu'à 0 n'est pas automatiquement plus rapide qu'elle ne l'est, par exemple, en C. Tant que vous cachez la limite, bien sûr, ce qui compliquerait les choses si vous continuez après le premier match (mais pas si vous vous arrêtez dessus).

0 votes

Si l'on veut aller plus vite, pourquoi ne pas utiliser la fonction -- ? :D

36voto

enesn Points 475

Liste des One Liners

Résolvons ce problème pour ce tableau :

var array = ['A', 'B', 'C'];

1. Ne retirez que le premier : Utilisation Si vous êtes sûr que l'article existe

array.splice(array.indexOf('B'), 1);

2. Ne retirez que le dernier : Utiliser Si vous êtes sûr que l'article existe

array.splice(array.lastIndexOf('B'), 1);

3. Supprimez toutes les occurrences :

array = array.filter(v => v !== 'B');

22voto

qwertymk Points 9783

DEMO

Vous devez trouver l'emplacement de ce que vous cherchez avec .indexOf() puis l'enlever avec .splice()

function remove(arr, what) {
    var found = arr.indexOf(what);

    while (found !== -1) {
        arr.splice(found, 1);
        found = arr.indexOf(what);
    }
}

var array = new Array();
array.push("A");
array.push("B");
array.push("C");
 ​   
remove(array, 'B');
alert(array)​​​​;

Cela permettra de régler tous les cas de figure.

0 votes

Pour les navigateurs qui ne prennent pas en charge .indexOf() vous pouvez ajouter ce à votre fichier javascript.

0 votes

Oui, élégant. Si vous avez besoin d'une option pour ne supprimer que certains éléments, par exemple seulement le premier : la même mise à jour : jsfiddle.net/qpZFd/9

0 votes

J'obtiens toujours l'erreur suivante : Uncaught ReferenceError: array is not defined . Qu'est-ce qui ne va pas ?

17voto

Matt Points 684

Tout simplement

array.splice(array.indexOf(item), 1);

3 votes

Oui, sauf que indexOf retournera -1 si rien n'est trouvé et whoops, splice supprimera 1 élément de la fin du tableau

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