171 votes

Supprimer plusieurs éléments d'un tableau en Javascript/jQuery

J'ai deux tableaux. Le premier tableau contient certaines valeurs tandis que le second tableau contient les indices des valeurs qui devraient être supprimées du premier tableau. Par exemple :

var valuesArr = new Array("v1","v2","v3","v4","v5");   
var removeValFromIndex = new Array(0,2,4);

Je souhaite supprimer les valeurs présentes aux indices 0,2,4 de valuesArr . Je pensais que l'indigène splice pourrait aider, c'est pourquoi j'ai trouvé une méthode :

$.each(removeValFromIndex,function(index,value){
    valuesArr.splice(value,1);
});

Mais cela n'a pas fonctionné car après chaque splice les indices des valeurs dans valuesArr étaient différentes. Je pourrais résoudre ce problème en utilisant un tableau temporaire et en copiant toutes les valeurs dans le second tableau, mais je me demandais s'il existait des méthodes natives auxquelles nous pourrions passer plusieurs indices pour supprimer des valeurs d'un tableau.

Je préférerais une solution jQuery. (Je ne sais pas si je peux utiliser grep ici)

332voto

nnnnnn Points 70578

Il y a toujours le bon vieux for boucle :

var valuesArr = ["v1","v2","v3","v4","v5"],
    removeValFromIndex = [0,2,4];    

for (var i = removeValFromIndex.length -1; i >= 0; i--)
   valuesArr.splice(removeValFromIndex[i],1);

Traverser removeValFromIndex dans l'ordre inverse et vous pouvez .splice() sans perturber les index des éléments qui doivent encore être supprimés.

Notez que j'ai utilisé la syntaxe littérale des tableaux avec des crochets pour déclarer les deux tableaux. C'est la syntaxe recommandée car new Array() est potentiellement déroutant car il réagit différemment selon le nombre de paramètres que vous lui passez.

EDITAR : Je viens de voir votre commentaire sur une autre réponse concernant le fait que le tableau d'index n'est pas nécessairement dans un ordre particulier. Si c'est le cas, triez-le par ordre décroissant avant de commencer :

removeValFromIndex.sort(function(a,b){ return b - a; });

Et poursuivre avec n'importe quelle boucle / $.each() / etc.

52voto

Je vous suggère d'utiliser Array.prototype.filter

var valuesArr = ["v1","v2","v3","v4","v5"];
var removeValFrom = [0, 2, 4];
valuesArr = valuesArr.filter(function(value, index) {
     return removeValFrom.indexOf(index) == -1;
})

37voto

Dan Ochiana Points 56

En voici un que j'utilise lorsque je n'utilise pas lodash/underscore :

while(IndexesToBeRemoved.length) {
    elements.splice(IndexesToBeRemoved.pop(), 1);
}

18voto

TheVillageIdiot Points 22158

Non in-place mais peut se faire en utilisant grep y inArray les fonctions de jQuery .

var arr = $.grep(valuesArr, function(n, i) {
    return $.inArray(i, removeValFromIndex) ==-1;
});

alert(arr);//arr contains V2, V4

vérifier cette violon.

17voto

Une solution simple et efficace (complexité linéaire) utilisant filtre y Set (jeu de mots) :

const valuesArr = ['v1', 'v2', 'v3', 'v4', 'v5'];   
const removeValFromIndex = [0, 2, 4];

const indexSet = new Set(removeValFromIndex);

const arrayWithValuesRemoved = valuesArr.filter((value, i) => !indexSet.has(i));

console.log(arrayWithValuesRemoved);

Le grand avantage de cette implémentation est que l'opération de recherche de l'ensemble ( has ) prend un temps constant, plus rapide que la réponse de nevace, par exemple.

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