AVERTISSEMENT : certaines des réponses les plus votées peuvent avoir des effets secondaires, par exemple, faire de mauvaises opérations lorsque le tableau ne contient pas l'élément à supprimer. Veuillez les utiliser avec précaution .
C'est une bonne nouvelle et oui, la bonne modification était nécessaire :)
Sarfraz
2
Je pense que la réponse @ user113716, concernant la méthode JS par défaut est la bonne façon. Toute méthode native sera toujours préférée et plus rapide.
neoswf
114
Cette réponse n'est-elle pas complètement fausse? Il s'agit de créer un nouveau tableau avec un élément manquant, pas de supprimer un élément du tableau. Ce n'est pas du tout la même chose.
James Moore
5
C'est une suppression avec une complexité de O (n) ... plus il y a de valeurs dans le tableau, pire ce sera ...
Lyth
2
La complexité de O (n) n'est pas un problème.
Omar Tariq
370
Avec jQuery, vous pouvez effectuer une opération sur une seule ligne comme celle-ci:
@Elankeeran - Vous êtes les bienvenus. : o) Je dois noter que cela supprimera uniquement la première instance. S'il y en a plusieurs à supprimer, cela ne fonctionnera pas.
user113716
7
J'ai également changé le removeItem en une valeur qui n'existe PAS dans le tableau et il a supprimé le dernier élément du tableau. Utilisez ceci si vous n'êtes pas certain de l'existence de removeItem: y = $ .grep (y, function (val) {return val! = RemoveItem;});
Solburn
52
AVERTISSEMENT - Peut supprimer le mauvais article! $ .inArray renvoie -1 si la valeur n'est pas présente et .splice traite un index négatif comme «de la fin», donc si la valeur que vous essayez de supprimer n'est pas présente, une autre valeur sera supprimée à la place. $ .Grep supprimera également toutes les occurrences alors que cette méthode n'en supprimera que la première.
Ryan Williams
1
Pour résoudre les deux problèmes décrits ci-dessus, utilisez une whileboucle et une variable temporaire comme celle-ci:var found; while ((found = $.inArray(removeItem, y)) !== -1) y.splice(found, 1);
1
Bien qu'il soit beaucoup plus agréable avec ES5 .indexOf()au lieu de jQuery, car vous pouvez utiliser le dernier index trouvé comme point de départ pour la prochaine recherche, ce qui est beaucoup plus efficace que de rechercher le tableau entier à chaque fois. var found=0; while ((found = y.indexOf(removeItem, found)) !== -1) y.splice(found, 1);
51
jQuery.filterest utile. Ceci est disponible pour les Arrayobjets.
var arr =[1,2,3,4,5,5];var result = arr.filter(function(elem){return elem !=5;});//result -> [1,2,3,4]
Semble tirer le meilleur parti des solutions proposées, même si cela ne modifie pas la matrice existante mais en crée plutôt une nouvelle. Il fonctionne également avec des valeurs non existantes ou un tableau vide. Vérification rapide des performances dans JSFiddle J'ai fait: avec un tableau avec 800 000 valeurs, il a fallu environ 6 secondes pour terminer. Je ne sais pas si c'est rapide cependant.
Flo
2
Cette solution utilise un filtre de fonction d'ordre supérieur vanilla JS, PAS une méthode de filtre jQuery.
Kalimah
J'aime cela! Cela semble la meilleure solution même si ce n'est pas jquery ...
Sam
36
Vous pouvez utiliser underscore.js . Cela rend vraiment les choses simples.
Dans votre cas, tout le code que vous devrez écrire est -
Array.prototype.remove=function(v){this.splice(this.indexOf(v)==-1?this.length :this.indexOf(v),1);}var a =['a','b','c'];
a.remove('c');//value of "a" is now ['a','b']
//This prototype function allows you to remove even array from arrayArray.prototype.remove=function(x){var i;for(i inthis){if(this[i].toString()== x.toString()){this.splice(i,1)}}}
Pour utiliser cette fonction prototype, vous devez la coller dans votre code. Ensuite, vous pouvez l'appliquer à n'importe quel tableau avec la «notation par points»:
Un peu plus d'explications ne manqueraient pas ici!
Gaz Winter
Pour utiliser cette fonction prototype, vous devez la coller dans votre code. Ensuite, vous pouvez l'appliquer à n'importe quel tableau avec la «notation par points», par exemple: someArr.remove («elem1»)
yesnik
3
Le seul problème avec quelque chose comme ça est qu'il écrase la méthode de suppression de l'objet Array global, ce qui signifie que tout autre code du projet qui dépend du comportement par défaut se retrouve avec un comportement bogué.
jmort253
2
Un autre problème est que la variable globale iest écrasée.
Roland Illig
5
Il n'y a aucun moyen natif de le faire en Javascript. Vous pouvez utiliser une bibliothèque ou écrire une petite fonction pour le faire à la place: http://ejohn.org/blog/javascript-array-remove/
Cela effacera tout le tableau si la valeur n'est pas là, donc un searchValue = 4 retournera un tableau vide.
Julian K
3
J'ai copié le code dans jsfiddle, changé searchValueen 4, exécuté le code, aucun problème détecté. Toutes les valeurs étaient toujours présentes. @ JulianK
RST
4
Ma version de la réponse de user113716. Son supprime une valeur si aucune correspondance n'est trouvée, ce qui n'est pas bon.
var y =[1,2,3]var removeItem =2;var i = $.inArray(removeItem,y)if(i >=0){
y.splice(i,1);}
alert(y);
Cela supprime désormais 1 élément si une correspondance est trouvée, 0 si aucune correspondance n'est trouvée.
Comment ça fonctionne:
$ .inArray (valeur, tableau) est une fonction jQuery qui trouve le premier index d'un valuedans unarray
Ce qui précède renvoie -1 si la valeur n'est pas trouvée, vérifiez donc que i est un index valide avant de procéder à la suppression. La suppression de l'index -1 signifie la suppression du dernier, ce qui n'est pas utile ici.
.splice (index, count) supprime le countnombre de valeurs à partir de index, donc nous voulons juste un countde1
//in case somebody needs something like this: multidimensional array (two items)var ar =[[0,'a'],[1,'b'],[2,'c'],[3,'d'],[4,'e'],[5,'f']];var removeItem =3;
ar = jQuery.grep(ar,function(n){return n[0]!= removeItem;//or n[1] for second item in two item array});
ar;
Il existe une solution simple avec épissure. Selon W3School, la syntaxe d'épissage est la suivante;
array.splice(index, howmany, item1,....., itemX)
index Obligatoire. Un entier qui spécifie à quelle position ajouter / supprimer des éléments, Utilisez des valeurs négatives pour spécifier la position à partir de la fin du tableau
combien requis. Le nombre d'éléments à supprimer. S'il est défini sur 0, aucun élément ne sera supprimé
item1, ..., itemX Facultatif. Le ou les nouveaux éléments à ajouter au tableau
Gardez cela à l'esprit, les js suivants feront apparaître un ou plusieurs éléments correspondants du tableau donné s'ils sont trouvés, sinon ils ne supprimeraient pas le dernier élément du tableau.
var x =[1,2,3,4,5,4,4,6,7];var item =4;var startItemIndex = $.inArray(item, x);var itemsFound = x.filter(function(elem){return elem == item;}).length;
Ou
var itemsFound = $.grep(x,function(elem){return elem == item;}).length;
maintenant au-dessus de la ligne supprimera cet élément du tableau s'il est trouvé. Pour résumer la logique ci-dessous est le code requis pour vérifier et supprimer l'élément du tableau.
/** SUBTRACT ARRAYS **/function subtractarrays(array1, array2){var difference =[];for(var i =0; i < array1.length; i++){if( $.inArray( array1[i], array2 )==-1){
difference.push(array1[i]);}}return difference;}
Vous pouvez ensuite appeler la fonction n'importe où dans votre code.
var I_like =["love","sex","food"];var she_likes =["love","food"];
alert("what I like and she does't like is: "+ subtractarrays( I_like, she_likes ));//returns "Naughty :P"!
Cela fonctionne dans tous les cas et évite les problèmes dans les méthodes ci-dessus. J'espère que cela pourra aider!
La deuxième réponse la plus votée ici est sur la piste la plus proche possible d'une méthode jQuery à une ligne du comportement souhaité du PO, mais ils ont trébuché à la fin de leur code, et il a un défaut. Si votre élément à supprimer n'est pas réellement dans le tableau, le dernier élément sera supprimé.
Quelques-uns ont remarqué ce problème et certains ont proposé des moyens de boucler pour éviter cela. J'offre la méthode la plus courte et la plus propre que j'ai pu trouver, et j'ai commenté sous leur réponse la manière de corriger leur code selon cette méthode.
var x =[1,2,"bye",3,4];var y =[1,2,3,4];var removeItem ="bye";// Removing an item that exists in array
x.splice( $.inArray(removeItem,x), $.inArray(removeItem,x));// This is the one-liner used// Removing an item that DOESN'T exist in array
y.splice( $.inArray(removeItem,y), $.inArray(removeItem,y));// Same usage, different array// OUTPUT -- both cases are expected to be [1,2,3,4]
alert(x +'\n'+ y);
le tableau x supprimera facilement l'élément "bye" et le tableau y sera intact.
L'utilisation de l'argument $.inArray(removeItem,array)comme deuxième argument finit par être la longueur à épisser. Étant donné que l'élément n'a pas été trouvé, cela est évalué array.splice(-1,-1);, ce qui entraînera simplement que rien ne sera épissé ... le tout sans avoir à écrire une boucle pour cela.
Pour supprimer en toute sécurité 2 du tableau à l'aide de JavaScript vanilla:
// Define polyfill for browsers that don't natively support Array.indexOf()if(!Array.prototype.indexOf){Array.prototype.indexOf =function(searchElement, fromIndex){var k;if(this===null){thrownewTypeError('"this" is null or not defined');}var O =Object(this),
len = O.length >>>0;if(len===0)return-1;var n =+fromIndex ||0;if(Math.abs(n)===Infinity) n =0;if(n >= len)return-1;
k =Math.max(n >=0? n : len -Math.abs(n),0);while(k < len){if(k in O && O[k]===searchElement)return k;++k;}return-1;};}// Remove first instance of 2 from arrayif(y.indexOf(2)>-1){
y.splice(y.indexOf(2),1);}/* To remove all instances of 2 from array, change 'if' to 'while':
while (y.indexOf(2) > -1) {
y.splice(y.indexOf(2), 1);
}
*/
console.log(y);// Returns [1, 3]
Réponses:
Un JSFIDDLE fonctionnel
Vous pouvez faire quelque chose comme ça:
Résultat:
http://snipplr.com/view/14381/remove-item-from-array-with-jquery/
la source
Avec jQuery, vous pouvez effectuer une opération sur une seule ligne comme celle-ci:
Exemple: http://jsfiddle.net/HWKQY/
Utilise le natif
.splice()
et jQuery$.inArray()
.la source
while
boucle et une variable temporaire comme celle-ci:var found; while ((found = $.inArray(removeItem, y)) !== -1) y.splice(found, 1);
.indexOf()
au lieu de jQuery, car vous pouvez utiliser le dernier index trouvé comme point de départ pour la prochaine recherche, ce qui est beaucoup plus efficace que de rechercher le tableau entier à chaque fois.var found=0; while ((found = y.indexOf(removeItem, found)) !== -1) y.splice(found, 1);
jQuery.filter
est utile. Ceci est disponible pour lesArray
objets.http://jsfiddle.net/emrefatih47/ar0dhvhw/
Dans Ecmascript 6:
https://jsfiddle.net/emrefatih47/nnn3c2fo/
la source
Vous pouvez utiliser underscore.js . Cela rend vraiment les choses simples.
Dans votre cas, tout le code que vous devrez écrire est -
et le résultat sera [1,3].
Cela réduit le code que vous écrivez.
la source
Pas un moyen jQuery mais ... Pourquoi ne pas utiliser un moyen plus simple. Supprimer «c» du tableau suivant
Vous pouvez également utiliser: (Remarque pour moi-même: ne modifiez pas les objets que vous ne possédez pas )
L'ajout est plus simple
a.push('c')
la source
Supprimer l'élément dans le tableau
la source
Exemple d'utilisation
Pour utiliser cette fonction prototype, vous devez la coller dans votre code. Ensuite, vous pouvez l'appliquer à n'importe quel tableau avec la «notation par points»:
la source
i
est écrasée.Il n'y a aucun moyen natif de le faire en Javascript. Vous pouvez utiliser une bibliothèque ou écrire une petite fonction pour le faire à la place: http://ejohn.org/blog/javascript-array-remove/
la source
Vous pouvez utiliser la fonction .not comme ceci:
la source
searchValue
en 4, exécuté le code, aucun problème détecté. Toutes les valeurs étaient toujours présentes. @ JulianKMa version de la réponse de user113716. Son supprime une valeur si aucune correspondance n'est trouvée, ce qui n'est pas bon.
Cela supprime désormais 1 élément si une correspondance est trouvée, 0 si aucune correspondance n'est trouvée.
Comment ça fonctionne:
value
dans unarray
count
nombre de valeurs à partir deindex
, donc nous voulons juste uncount
de1
la source
la source
Il existe une solution simple avec épissure. Selon W3School, la syntaxe d'épissage est la suivante;
index Obligatoire. Un entier qui spécifie à quelle position ajouter / supprimer des éléments, Utilisez des valeurs négatives pour spécifier la position à partir de la fin du tableau
combien requis. Le nombre d'éléments à supprimer. S'il est défini sur 0, aucun élément ne sera supprimé
item1, ..., itemX Facultatif. Le ou les nouveaux éléments à ajouter au tableau
Gardez cela à l'esprit, les js suivants feront apparaître un ou plusieurs éléments correspondants du tableau donné s'ils sont trouvés, sinon ils ne supprimeraient pas le dernier élément du tableau.
Ou
La finale devrait donc ressembler à ceci
J'espère que cela t'aides.
la source
la source
J'ai eu une tâche similaire où je devais supprimer plusieurs objets à la fois en fonction d'une propriété des objets du tableau.
Donc, après quelques itérations, je me retrouve avec:
la source
J'étendrais la classe Array avec une
pick_and_remove()
fonction, comme ceci:Bien que cela puisse sembler un peu bavard, vous pouvez maintenant appeler
pick_and_remove()
n'importe quel tableau que vous souhaitez!Usage:
Vous pouvez voir tout cela dans une action sur le thème pokemon ici.
la source
Vous pouvez ensuite appeler la fonction n'importe où dans votre code.
Cela fonctionne dans tous les cas et évite les problèmes dans les méthodes ci-dessus. J'espère que cela pourra aider!
la source
Essayez ça ça marche pour moi
la source
La deuxième réponse la plus votée ici est sur la piste la plus proche possible d'une méthode jQuery à une ligne du comportement souhaité du PO, mais ils ont trébuché à la fin de leur code, et il a un défaut. Si votre élément à supprimer n'est pas réellement dans le tableau, le dernier élément sera supprimé.
Quelques-uns ont remarqué ce problème et certains ont proposé des moyens de boucler pour éviter cela. J'offre la méthode la plus courte et la plus propre que j'ai pu trouver, et j'ai commenté sous leur réponse la manière de corriger leur code selon cette méthode.
le tableau x supprimera facilement l'élément "bye" et le tableau y sera intact.
L'utilisation de l'argument
$.inArray(removeItem,array)
comme deuxième argument finit par être la longueur à épisser. Étant donné que l'élément n'a pas été trouvé, cela est évaluéarray.splice(-1,-1);
, ce qui entraînera simplement que rien ne sera épissé ... le tout sans avoir à écrire une boucle pour cela.la source
Pour supprimer en toute sécurité 2 du tableau à l'aide de JavaScript vanilla:
Source Polyfill: Mozilla
la source
Juste pour ajouter à la réponse de Sarfraz, personne n'a surpris que cela en soit encore une fonction.
Utilisez la réponse de ddagsan en utilisant la méthode .filter si vous avez plusieurs fois la même valeur dans votre tableau.
la source