Recherche de tableau Javascript et supprimer la chaîne?

134

J'ai:

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

Je veux pouvoir faire quelque chose comme:

array.remove("B");

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

Rolando
la source
5
Une combinaison de .indexOf()et .splice()devrait faire l'affaire. Ou peut - être, au contraire, .filter().
Marc B

Réponses:

186

Je mets à jour ce fil avec une solution 1 ligne plus récente:

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

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

Remarque: supprimera toutes les occurrences.

ÉDITER:

Si vous souhaitez 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']
Tyrannas
la source
1
Cette solution renvoie une copie du tableau, tandis que l'utilisation de splice supprime le ou les éléments en place. Ce que vous choisissez dépend du contexte.
twhitehead
6
C'est parfait pour les trucs Redux où vous devez retourner un nouvel état.
colinwong
@Regis en fait pas, arr.filter renvoie un nouveau tableau. Donc arr.filter (e => e! == 'B') ne modifiera pas arr. Ou peut-être n'ai-je pas bien compris votre commentaire?
Tyrannas
existe-t-il une méthode pour faire cela mais pour s'arrêter à la première occurrence? donc si theres 5 'B pour simplement en supprimer un?
Ari
1
@Ari J'ai mis à jour la réponse pour supprimer un seul élément
Tyrannas
171

Parcourez la liste dans l'ordre inverse et utilisez la .splicemé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 toutes 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, les éléments suivants fonctionnent également:

var index = array.indexOf(search_term);    // <-- Not supported in <IE9
if (index !== -1) {
    array.splice(index, 1);
}
Rob W
la source
1
Je suppose que c'est censé être légèrement plus rapide pour itérer en sens inverse.
Ben Clayton
1
@BenClayton: Merci. FWIW, en JavaScript, ce n'est pas vrai de manière fiable. Le compte à rebours 0n'est pas automatiquement plus rapide comme c'est le cas, disons, C. Tant que vous mettez en cache 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).
TJ Crowder
Si nous optons pour la vitesse, pourquoi ne pas utiliser while -? : D
Snuffleupagus
11
Ce n'est pas une question de vitesse, il le dit même dans sa réponse. Il s'agit d'éléments SKIPPING. Si vous êtes en position 5 et que vous épissez cette position, l'élément formant le bijou situé en position 6 est maintenant en 5 . Pourtant, votre compteur de boucles augmente, la prochaine itération est la position 6 et c'est là que vous avez sauté un élément. C'est pourquoi c'est dans l'ordre inverse.
amenthes
1
Si vous supprimez des éléments dans une boucle avant et qu'un élément est supprimé, la dernière itération peut lever des exceptions de pointeur nul car elle fera référence à un index qui n'existe pas
Drenai
24

Liste des doublures

Résolvons ce problème pour ce tableau:

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

1. Ne supprimez que le premier: Utilisez Si vous êtes sûr que l'élément existe

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

2. Ne supprimez que le dernier: Utilisez Si vous êtes sûr que l'élément existe

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

3. Supprimez toutes les occurrences:

array = array.filter(v => v !== 'B'); 
enesn
la source
21

DEMO

Vous devez trouver l'emplacement de ce que vous recherchez, .indexOf()puis le supprimer 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 prendra en charge toutes les occurrences.

qwertymk
la source
Pour les navigateurs qui ne prennent pas en charge , .indexOf()vous pouvez ajouter ce à votre fichier javascript.
qwertymk
oui, élégant. Si vous avez besoin d'une option pour supprimer uniquement certains éléments, par exemple uniquement le premier: la même mise à jour: jsfiddle.net/qpZFd/9
sebilasse
Je reçois toujours l'erreur suivante: Uncaught ReferenceError: array is not defined. Qu'est-ce qui ne va pas?
Pathros
Si vous empruntez cette voie, vous pouvez facilement profiter d' .indexOf()un peu plus. Si vous passez foundcomme deuxième argument à l' .indexOf()appel dans la boucle while , les éléments du tableau qui ont déjà été vérifiés et qui ont fini par ne pas être égaux ne sont pas vérifiés à nouveau: found = arr.indexOf(what, found);
pimmhogeling
14

Simplement

array.splice(array.indexOf(item), 1);
Mat
la source
ouais sauf que indexOf retournera -1si rien n'est trouvé et oups, splice supprimera 1 élément de la fin du tableau
Ricky Spanish
2

Solution simple (ES6)

Si vous n'avez pas d'élément en double

Array.prototype.remove = function(elem) {
  var indexElement = this.findIndex(el => el === elem);
  if (indexElement != -1)
    this.splice(indexElement, 1);
  return this;
};   

Démo en ligne (violon)

Ali Soltani
la source
Cette solution supprime toujours le dernier élément si AUCUNE correspondance n'est trouvée.
markus s
1

Vous devez écrire votre propre suppression. Vous pouvez parcourir le tableau, saisir l'index de l'élément que vous souhaitez supprimer et l'utiliser splicepour le supprimer.

Vous pouvez également créer un nouveau tableau, faire une boucle sur le tableau actuel et si l'objet actuel ne correspond pas à ce que vous souhaitez supprimer, placez-le dans un nouveau tableau.

hvgotcodes
la source
1

utilisation:

array.splice(2, 1);

Cela supprime un élément du tableau, en commençant à l'index 2 (3e élément)

Ben Clayton
la source
1
en fait, il supprimera le deuxième élément du tableau, l'index commence à zéro. cette instruction a une ambiguïté, un exemple plus simple pourrait être comme celui array.splice(2,1)qui supprime 1 élément à l'index 2 du tableau. consultez https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice pour plus de détails
imdzeeshan
1
const changedArray = array.filter( function(value) {
  return value !== 'B'
});

ou vous pouvez utiliser:

const changedArray = array.filter( (value) => value === 'B');

Le changesArray contiendra la valeur sans 'B'

siva gopi
la source
0

utilisez array.splice

/*array.splice(index , howMany[, element1[, ...[, elementN]]])

array.splice(index) // SpiderMonkey/Firefox extension*/

array.splice(1,1)

Source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

chepe263
la source
La virgule entre arrayet splicedoit être un point.
Rob W
Tentative de correction, mais la politique de SO stipule que les modifications doivent comporter au moins 6 caractères: /
ben_nuttall