Comment supprimer un élément spécifique d'un tableau en javascript?

J'ai un tableau d'entiers et j'utilise la méthode .push() pour y ajouter des éléments.

Existe-t-il un moyen simple de supprimer un élément spécifique d'un tableau? L'équivalent de quelque chose comme array.remove(int); .

J'ai besoin d'utiliser du javascript basique - aucun framework n'est autorisé.

6774
24 апр. fixé par Walker le 24 avr. 2011-04-24 01:17 '11 à 1:17 2011-04-24 01:17
@ 78 réponses
  • 1
  • 2
  • 3

Recherchez l' index de l'élément de tableau que vous souhaitez supprimer, puis supprimez cet index à l'aide de l' splice .

La méthode splice () modifie le contenu d'un tableau en supprimant des éléments existants et / ou en ajoutant de nouveaux éléments.

prise en charge du navigateur pour indexOf est limitée.  Il n'est pas pris en charge dans Internet Explorer 7 et 8. 

Si vous avez besoin de indexOf dans un navigateur non pris en charge, essayez polyfill next polyfill . Trouvez plus d'informations sur ce polyfill ici .

 Array.prototype.indexOf || (Array.prototype.indexOf = function(d, e) { var a; if (null == this) throw new TypeError('"this" is null or not defined'); var c = Object(this), b = c.length >>> 0; if (0 === b) return -1; a = +e || 0; Infinity === Math.abs(a)  (a = 0); if (a >= b) return -1; for (a = Math.max(0 <= a ? a : b - Math.abs(a), 0); a < b;) { if (a in c  c[a] === d) return a; a++ } return -1 }); 
9765
24 апр. La réponse a été donnée par Tom Wadley le 24 avril. 2011-04-24 01:23 '11 à 1:23 2011-04-24 01:23

Je ne sais pas comment vous vous attendez à ce que array.remove(int) se comporte. Il y a trois possibilités auxquelles vous pouvez penser.

Pour supprimer un élément de tableau d'indice i :

 array.splice(i, 1); 

Si vous souhaitez supprimer chaque élément avec des valeurs number d'un tableau:

border=0
 for(var i = array.length - 1; i >= 0; i--) { if(array[i] === number) { array.splice(i, 1); } } 

Si vous voulez juste faire un élément avec un index, i n'existe plus, mais vous ne voulez pas que les index des autres éléments changent:

 delete array[i]; 
990
24 апр. Réponse donnée par Peter Olson le 24 avril 2011-04-24 01:20 '11 à 1:20 2011-04-24 01:20

Édité en octobre 2016

  • Rendez-le simple, intuitif et explicite ( https://en.wikipedia.org/wiki/Occam%27s_razor )
  • Faites-le inchangé (le tableau d'origine restera inchangé)
  • Faites-le avec les fonctions JS standard, si votre navigateur ne les prend pas en charge - utilisez polyfill

Dans cet exemple de code, j'utilise la fonction array.filter (...) pour supprimer les éléments indésirables d'un tableau, cette fonction ne modifie pas le tableau d'origine et en crée un nouveau. Si votre navigateur ne prend pas en charge cette fonction (par exemple, IE jusqu'à la version 9 ou Firefox avant version 1.5), envisagez d’utiliser le filtre polyfill de Mozilla .

Suppression d'élément (code ECMA-262 Edition 5 alias oldstyle JS)

 var value = 3 var arr = [1, 2, 3, 4, 5, 3] arr = arr.filter(function(item) { return item !== value }) console.log(arr) // [ 1, 2, 4, 5 ] 

Suppression d'un élément (code ES2015)

 let value = 3 let arr = [1, 2, 3, 4, 5, 3] arr = arr.filter(item => item !== value) console.log(arr) // [ 1, 2, 4, 5 ] 

IMPORTANT ES2015 "() => {}" La syntaxe de la fonction de flèche n'est pas prise en charge dans IE en général, Chrome jusqu'à la version 45, Firefox jusqu'à la version 22, Safari jusqu'à la version 10. Pour utiliser la syntaxe ES2015 dans les anciens navigateurs, vous pouvez utiliser BabelJS.


Suppression de plusieurs éléments (code ES2016)

Un autre avantage de cette méthode est que vous pouvez supprimer plusieurs éléments.

 let forDeletion = [2, 3, 5] let arr = [1, 2, 3, 4, 5, 3] arr = arr.filter(item => !forDeletion.includes(item)) // !!! Read below about array.includes(...) support !!! console.log(arr) // [ 1, 4 ] 

IMPORTANT "array.includes (...)" n'est pas du tout pris en charge dans IE, Chrome jusqu'à la version 47, Firefox jusqu'à la version 43, Safari jusqu'à la version 9 et Edge jusqu'à la version 14, voici donc les polyfields de Mozilla.

Supprimer plusieurs éléments (JavaScript expérimental avancé ES2018?)

 // array-lib.js export function remove(...forDeletion) { return this.filter(item => !forDeletion.includes(item)) } // main.js import { remove } from './array-lib.js' let arr = [1, 2, 3, 4, 5, 3] // :: This-Binding Syntax Proposal // using "remove" function as "virtual method" // without extending Array.prototype arr = arr::remove(2, 3, 5) console.log(arr) // [ 1, 4 ] 

50 builtIns = false code = function remove (... forDeletion) {retour this.filter (item =>! ForDeletion.includes (item))} let arr = [1, 2, 3, 4, 5, 3] // :: This-Binding Syntax Proposition // utilisant la fonction remove comme "méthode virtuelle" arr = arr :: remove (2, 3, 5) console.log (arr) // [1, 4] rel = noreferrer> Essayez vous-même dans BabelJS: )

L'aide

814
19 дек. La réponse est donnée par Ujeenator le 19 décembre 2013-12-19 22:54 13 à 22h54 2013-12-19 22:54

Selon que vous souhaitiez économiser de l'espace ou non.

Si vous avez besoin d'un emplacement vide, la suppression se fera sans problème:

 delete array[ index ]; 

Si vous ne le faites pas, vous devriez utiliser la méthode d' épissure :

 array.splice( index, 1 ); 

Et si vous avez besoin de la valeur de cet élément, vous pouvez simplement sauvegarder l'élément renvoyé du tableau:

 var value = array.splice( index, 1 )[0]; 

Si vous voulez le faire dans un ordre spécifique, vous pouvez utiliser array.pop() pour ce dernier ou array.shift() pour le premier (et les deux renvoient également la valeur de l'élément).

Et si vous ne connaissez pas l'index d'un élément, vous pouvez utiliser array.indexOf( item ) pour l'obtenir (dans if() pour obtenir un élément ou dans while() pour les obtenir tous). array.indexOf( item ) renvoie soit un index, soit -1 s'il n'est pas trouvé.

381
24 апр. réponse donnée xavierm02 24 avril 2011-04-24 01:32 '11 à 1:32 2011-04-24 01:32

Un ami avait un problème avec Internet Explorer 8 et il m'a montré ce qu'il avait fait. Je lui ai dit que c'était faux et il m'a dit qu'il avait reçu une réponse ici. La réponse actuelle maximale ne fonctionnera pas dans tous les navigateurs (par exemple, Internet Explorer 8) et ne supprimera que la première occurrence de l'élément.

Supprimer TOUTES les instances du tableau

 function remove(arr, item) { for (var i = arr.length; i--;) { if (arr[i] === item) { arr.splice(i, 1); } } } 

Il recule dans le tableau (car les index et la longueur changeront au fur et à mesure que les éléments seront supprimés) et supprimera l'élément s'il est trouvé. Cela fonctionne dans tous les navigateurs.

249
10 авг. Réponse donnée par Ben Lesh 10 août 2013-08-10 22:21 13 à 22h21 2013-08-10 22:21

Il y a deux approches principales:

  • splice () : anArray.splice(index, 1);

  • delete : delete anArray[index];

Soyez prudent lorsque vous utilisez delete pour un tableau. C'est bon pour supprimer les attributs d'objet, mais pas pour les tableaux. Mieux vaut utiliser splice pour les tableaux.

Gardez à l'esprit que lorsque vous utilisez delete pour un tableau, vous pouvez obtenir des résultats incorrects pour anArray.length . En d'autres termes, delete supprime l'élément mais ne met pas à jour la valeur de la propriété length.

Vous pouvez également vous attendre à des trous dans les numéros d'index après avoir utilisé une suppression, par exemple. vous pouvez obtenir des index de 1,3,4,8,9,9,11 et de longueur, comme c'était le cas avant la suppression. Dans ce cas, toutes les boucles indexées for seront bouclées, car les index ne sont plus cohérents.

Si pour une raison quelconque vous devez utiliser la delete , vous devez utiliser for each boucle lorsque vous devez effectuer une itération dans des tableaux. En fait, évitez toujours d'utiliser des boucles indexées pour, si possible. Ainsi, le code sera plus fiable et moins sujet aux problèmes d’index.

140
21 дек. la réponse est donnée à Sasa 21 déc. 2012-12-21 14:32 '12 à 14:32 2012-12-21 14:32
 Array.prototype.remByVal = function(val) { for (var i = 0; i < this.length; i++) { if (this[i] === val) { this.splice(i, 1); i--; } } return this; } //Call like [1, 2, 3, 4].remByVal(3); 

116
24 апр. la réponse est donnée à Zirak le 24 avril. 2011-04-24 01:20 '11 à 1:20 2011-04-24 01:20

Pas besoin d'utiliser indexOf ou splice . Toutefois, cela fonctionne mieux si vous souhaitez supprimer une seule occurrence de l'élément.

Rechercher et déplacer (déplacer):

 function move(arr, val) { var j = 0; for (var i = 0, l = arr.length; i < l; i++) { if (arr[i] !== val) { arr[j++] = arr[i]; } } arr.length = j; } 

Utilisez indexOf et splice (indexof):

 function indexof(arr, val) { var i; while ((i = arr.indexOf(val)) != -1) { arr.splice(i, 1); } } 

Utilisez uniquement des splice :

 function splice(arr, val) { for (var i = arr.length; i--;) { if (arr[i] === val) { arr.splice(i, 1); } } } 

Délai de déploiement de nodejs pour un tableau contenant 1 000 éléments (une moyenne de plus de 10 000 exécutions):

L'index est environ 10 fois plus lent que le déplacement. Même s'il est amélioré en supprimant l'appel indexOf dans une épissure, les performances sont bien pires que le déplacement.

 Remove all occurrences: move 0.0048 ms indexof 0.0463 ms splice 0.0359 ms Remove first occurrence: move_one 0.0041 ms indexof_one 0.0021 ms 
86
19 сент. La réponse est donnée le 19 septembre 2013-09-19 04:53 '13 à 4:53 2013-09-19 04:53

Le moyen le plus simple:

 var index = array.indexOf(item); if(index != -1) array.splice( index, 1 ); 
81
02 дек. La réponse est donnée par Nanego le 02 décembre. 2017-12-02 20:42 '17 à 20h42 2017-12-02 20:42

Trop vieux pour répondre, mais peut-il aider quelqu'un en fournissant un prédicat au lieu d'une valeur.

NOTE: il mettra à jour ce tableau et retournera les lignes affectées.

Utilisation de

 var removed = helper.removeOne(arr, row => row.id === 5 ); var removed = helper.remove(arr, row => row.name.startsWith('BMW')); 

La définition

 var helper = { // Remove and return the first occurrence removeOne: function(array, predicate) { for (var i = 0; i < array.length; i++) { if (predicate(array[i])) { return array.splice(i, 1); } } }, // Remove and return all occurrences remove: function(array, predicate) { var removed = []; for (var i = 0; i < array.length;) { if (predicate(array[i])) { removed.push(array.splice(i, 1)); continue; } i++; } return removed; } }; 
58
02 мая '14 в 15:00 2014-05-02 15:00 la réponse est donnée le 02 mai '14 à 15:00 heures 2014-05-02 15:00

John Resig a publié une bonne implémentation :

 // Array Remove - By John Resig (MIT Licensed) Array.prototype.remove = function(from, to) { var rest = this.slice((to || from) + 1 || this.length); this.length = from < 0 ? this.length + from : from; return this.push.apply(this, rest); }; 

Si vous ne souhaitez pas étendre l'objet global, vous pouvez procéder comme suit:

 // Array Remove - By John Resig (MIT Licensed) Array.remove = function(array, from, to) { var rest = array.slice((to || from) + 1 || array.length); array.length = from < 0 ? array.length + from : from; return array.push.apply(array, rest); }; 

Mais la principale raison pour laquelle je publie cette publication est pour alerter les utilisateurs sur la mise en oeuvre alternative suggérée dans les commentaires sur cette page (14 décembre 2007):

 Array.prototype.remove = function(from, to){ this.splice(from, (to=[0,from||1,++to-from][arguments.length])<0?this.length+to:to); return this.length; }; 

Cela semble bien fonctionner au début, mais à travers le processus douloureux, j'ai découvert que cela ne fonctionnait pas, en essayant de supprimer le deuxième élément avant le dernier élément du tableau. Par exemple, si vous avez un tableau de 10 éléments et que vous essayez de supprimer le 9ème élément avec ceci:

 myArray.remove(8); 

En conséquence, vous obtenez un tableau de 8 éléments. Je ne sais pas pourquoi, mais j'ai confirmé que l'implémentation initiale de John ne présentait pas ce problème.

55
30 авг. la réponse est donnée à Roger 30 août. 2013-08-30 22:07 13 à 22h07: 2013-08-30 22:07

Underscore.js peut être utilisé pour résoudre des problèmes avec plusieurs navigateurs. Il utilise les méthodes intégrées du navigateur, le cas échéant. S'ils manquent, comme c'est le cas avec les anciennes versions d'Internet Explorer, il utilise ses propres méthodes.

Un exemple simple pour supprimer des éléments d'un tableau (d'un site Web):

 _.without([1, 2, 1, 0, 3, 1, 4], 0, 1); // => [2, 3, 4] 
53
30 мая '14 в 12:57 2014-05-30 12:57 la réponse est donnée par vatsal le 30 mai 2014 à 12:57 2014-05-30 12:57

Vous pouvez le faire facilement avec la méthode de filtrage :

 function remove(arrOriginal, elementToRemove){ return arrOriginal.filter(function(el){return el !== elementToRemove}); } console.log( remove([1, 2, 1, 0, 3, 1, 4], 1) ); 

Cela supprime tous les éléments du tableau et fonctionne également plus rapidement que la combinaison slice et indexOf.

52
11 февр. La réponse est donnée par Salvador Dali le 11 février. 2014-02-11 01:06 '14 à 1:06 2014-02-11 01:06

Si vous souhaitez supprimer un nouveau tableau avec des positions supprimées, vous pouvez toujours supprimer un élément spécifique et filtrer le tableau. Vous devrez peut-être développer l'objet tableau pour les navigateurs qui n'implémentent pas la méthode de filtrage, mais à long terme, c'est plus facile, car vous procédez comme suit:

 var my_array = [1,2,3,4,5,6]; delete my_array[4]; console.log(my_array.filter(function(a){return typeof a !== 'undefined';})); 

Affichage obligatoire [1, 2, 3, 4, 6]

40
18 окт. Répondre Loupax 18 oct. 2012-10-18 13:13 '12 à 13:13 2012-10-18 13:13

Vous pouvez utiliser ES6.

 var array=['1','2','3','4','5','6'] var index = array.filter((value)=>value!='3'); 

Sortie:

 ["1", "2", "4", "5", "6"] 
37
04 окт. la réponse est donnée rajat44 04 oct. 2016-10-04 11:07 '16 à 11:07 2016-10-04 11:07

Découvrez ce code. Cela fonctionne dans tous les principaux navigateurs. .

 remove_item = function (arr, value) { var b = ''; for (b in arr) { if (arr[b] === value) { arr.splice(b, 1); break; } } return arr; } 

Appeler cette fonction

 remove_item(array,value); 
34
02 апр. La réponse est donnée par Ekramul Hoque le 02 avril. 2013-04-02 13:56 '13 à 13:56 2013-04-02 13:56

Vous pouvez utiliser lodash _. pull (tableau muté ), _.pullAt (tableau muté ) ou _. sans (ne mute pas le tableau),

 var array1 = ['a', 'b', 'c', 'd'] _.pull(array1, 'c') console.log(array1) // ['a', 'b', 'd'] var array2 = ['e', 'f', 'g', 'h'] _.pullAt(array2, 0) console.log(array2) // ['f', 'g', 'h'] var array3 = ['i', 'j', 'k', 'l'] var newArray = _.without(array3, 'i') // ['j', 'k', 'l'] console.log(array3) // ['i', 'j', 'k', 'l'] 
32
25 авг. la réponse est donnée à Chun Yang le 25 août. 2015-08-25 22:34 '15 à 22h34 2015-08-25 22:34

OK, par exemple, vous avez un tableau ci-dessous:

 var num = [1, 2, 3, 4, 5]; 

Et nous voulons supprimer le nombre 4, vous pouvez simplement créer le code suivant:

 num.splice(num.indexOf(4), 1); //num will be [1, 2, 3, 5]; 

Si vous réutilisez cette fonction, vous écrivez une fonction de réutilisation qui sera liée à la fonction de tableau natif, comme illustré ci-dessous:

 Array.prototype.remove = Array.prototype.remove || function(x) { const i = this.indexOf(x); if(i===-1) return; this.splice(i, 1); //num.remove(5) === [1, 2, 3]; } 

Mais que diriez-vous si vous avez un tableau ci-dessous et quelques [5] dans le tableau?

 var num = [5, 6, 5, 4, 5, 1, 5]; 

Nous avons besoin d'une boucle pour toutes les vérifier, mais il est plus simple et plus efficace d'utiliser les fonctions JavaScript intégrées. Nous écrivons donc une fonction qui utilise un filtre, comme indiqué ci-dessous:

 const _removeValue = (arr, x) => arr.filter(n => n!==x); //_removeValue([1, 2, 3, 4, 5, 5, 6, 5], 5) //return [1, 2, 3, 4, 6] 

Il existe également des bibliothèques tierces pour vous aider dans cette tâche, telles que Lodash ou Underscore, pour plus d'informations sur lodash _.pull, _.pullAt ou _.without.

32
10 мая '17 в 12:39 2017-05-10 12:39 La réponse est donnée par Alireza le 10 mai '17 à 12:39 2017-05-10 12:39

Je suis nouveau sur javascript et j'ai besoin de cette fonctionnalité. Je viens d'écrire ceci:

 function removeFromArray(array, item, index) { while((index = array.indexOf(item)) > -1) { array.splice(index, 1); } } 

Puis, quand je veux l'utiliser:

 //Set-up some dummy data var dummyObj = {name:"meow"}; var dummyArray = [dummyObj, "item1", "item1", "item2"]; //Remove the dummy data removeFromArray(dummyArray, dummyObj); removeFromArray(dummyArray, "item2"); 

Sortie - comme prévu. ["item1", "item1"]

Vous pouvez avoir des besoins différents des miens, vous pouvez donc facilement les modifier pour les adapter. J'espère que ça aide quelqu'un.

27
16 янв. la réponse est donnée par sofiax le 16 janvier 2014-01-16 14:27 14 à 14:27 2014-01-16 14:27

ES6 et sans mutation: (octobre 2016)

 const removeByIndex = (list, index) => [ ...list.slice(0, index), ...list.slice(index + 1) ]; 

Puis:

 removeByIndex([33,22,11,44],1) //=> [33,11,44] 
24
07 окт. Réponse donnée par Abdennour TOUMI 07 oct. 2016-10-07 22:42 '16 à 22h42 2016-10-07 22:42

Mise à jour: cette méthode est recommandée uniquement si vous ne pouvez pas utiliser ECMAScript 2015 (anciennement ES6). Si vous pouvez l'utiliser, d'autres réponses donnent beaucoup d'implémentations avancées.


Cette signification ici résoudra votre problème et supprimera toutes les occurrences de l’argument, pas seulement 1 (ou la valeur spécifiée).

 Array.prototype.destroy = function(obj){ // Return null if no objects were found and removed var destroyed = null; for(var i = 0; i < this.length; i++){ // Use while-loop to find adjacent equal objects while(this[i] === obj){ // Remove this[i] and store it within destroyed destroyed = this.splice(i, 1)[0]; } } return destroyed; } 

Application:

 var x = [1, 2, 3, 3, true, false, undefined, false]; x.destroy(3); // => 3 x.destroy(false); // => false x; // => [1, 2, true, undefined] x.destroy(true); // => true x.destroy(undefined); // => undefined x; // => [1, 2] x.destroy(3); // => null x; // => [1, 2] 
21
13 марта '13 в 12:28 2013-03-13 12:28 la réponse est donnée zykadelic le 13 mars 13 à 12:28 2013-03-13 12:28

Si vous avez des objets complexes dans un tableau, pouvez-vous utiliser des filtres? Dans les situations où $ .inArray ou array.splice n'est pas aussi facile à utiliser. Surtout si les objets sont éventuellement petits dans le tableau.

par exemple. si vous avez un objet avec le champ Id et que vous voulez que l'objet soit supprimé du tableau:

 this.array = this.array.filter(function(element, i) { return element.id !== idToRemove; }); 
20
09 апр. la réponse est donnée 09 avr. 2015-04-09 13:00 '15 à 13:00 2015-04-09 13:00

Voici quelques façons de supprimer un élément d'un tableau à l'aide de javascript .

Toutes les méthodes décrites ne modifient pas le tableau d'origine , mais en créent un nouveau.

Si vous connaissez l'index de l'article

Supposons que vous avez un tableau et que vous voulez supprimer un élément à la position i .

Une solution consiste à utiliser slice() :

 const items = ['a', 'b', 'c', 'd', 'e', 'f'] const valueToRemove = 'c' const filteredItems = items.filter(item => item !== valueToRemove) console.log(filteredItems) 

Il utilise les fonctions des flèches ES6. Vous pouvez utiliser les fonctionnalités traditionnelles pour prendre en charge les anciens navigateurs:

Par valeur

Vous pouvez rechercher une inclusion dans la fonction de rappel:

https://flaviocopes.com/how-to-remove-item-from-array/ ) 

20
04 мая '18 в 8:17 2018-05-04 08:17 La réponse est donnée par Flavio Copes le 04 mai '18 à 08:17 2018-05-04 08:17

Vous ne devriez jamais muter un tableau. Parce que cela contredit le modèle de programmation fonctionnel. Ce que vous pouvez faire est de créer un nouveau tableau sans référence au tableau pour lequel vous souhaitez modifier les données à l'aide de la méthode de filter ES6.

 var myArray = [1,2,3,4,5,6]; 

Supposons que vous vouliez supprimer 5 d'un tableau, vous pouvez le faire comme ceci.

 myArray = myArray.filter(value => value !== 5); 

Cela vous donnera un nouveau tableau sans la valeur que vous voulez supprimer. Donc, le résultat sera

  [1,2,3,4,6]; // 5 has been removed from this array 

Pour plus de compréhension, vous pouvez lire la documentation MDN sur Array.filter https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter.

19
26 дек. Réponse donnée par Adeel Imran le 26 déc. 2017-12-26 22:32 '17 à 22h32 2017-12-26 22:32

Plus moderne, ECMAScript 2015 (anciennement Harmony ou ES 6). Étant donné:

 const items = [1, 2, 3, 4]; const index = 2; 

Puis:

 items.filter((x, i) => i !== index); 

Cession:

 [1, 2, 4] 

Vous pouvez utiliser Babel et le service polyfill pour que les navigateurs soient efficaces.

18
25 апр. la réponse est donnée par bjfletcher le 25 avril . 2016-04-25 13:21 '16 à 13h21 2016-04-25 13:21

Je sais qu’il existe déjà de nombreuses réponses, mais beaucoup d’entre elles semblent compliquer le problème. Voici un moyen simple et récursif de supprimer toutes les occurrences d'une clé: elle appelle self jusqu'à ce qu'un index soit trouvé. Oui, cela ne fonctionne que dans les navigateurs avec indexOf , mais il est simple et peut être rempli facilement.

Fonction autonome

 function removeAll(array, key){ var index = array.indexOf(key); if(index === -1) return; array.splice(index, 1); removeAll(array,key); } 

Méthode prototype

 Array.prototype.removeAll = function(key){ var index = this.indexOf(key); if(index === -1) return; this.splice(index, 1); this.removeAll(key); } 
16
03 февр. La réponse est donnée wharding28 03 février 2014-02-03 18:41 '14 à 18:41 2014-02-03 18:41

J'ai une autre bonne solution pour supprimer d'un tableau:

 var words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present']; const result = words.filter(word => word.length > 6); console.log(result); // expected output: Array ["exuberant", "destruction", "present"] 

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

15
05 июня '18 в 17:47 2018-06-05 17:47 répondit à Aram Grigoryan le 05 juin 18 à 17h47 2018-06-05 17:47

Vous pouvez faire une boucle inverse pour vous assurer que vous ne vissez pas les index s'il existe plusieurs occurrences de l'élément.

 var myElement = "chocolate"; var myArray = ['chocolate', 'poptart', 'poptart', 'poptart', 'chocolate', 'poptart', 'poptart', 'chocolate'];  for (var i = myArray.length - 1; i >= 0; i--) { if (myArray[i] == myElement) myArray.splice(i, 1); } 

Démo en direct

15
12 авг. la réponse est donnée par Jeff Noel 12 août. 2013-08-12 20:56 '13 à 20:56 2013-08-12 20:56

Sur la base de toutes les réponses qui étaient pour la plupart correctes et en tenant compte des meilleures recommandations (surtout sans utiliser directement Array.prototype), je suis arrivé au code suivant:

 function arrayWithout(arr, values) { var isArray = function(canBeArray) { if (Array.isArray) { return Array.isArray(canBeArray); } return Object.prototype.toString.call(canBeArray) === '[object Array]'; }; var excludedValues = (isArray(values)) ? values : [].slice.call(arguments, 1); var arrCopy = arr.slice(0); for (var i = arrCopy.length - 1; i >= 0; i--) { if (excludedValues.indexOf(arrCopy[i]) > -1) { arrCopy.splice(i, 1); } } return arrCopy; } 

En analysant la fonction ci-dessus, malgré le fait que cela fonctionne bien, j'ai réalisé qu'il pourrait y avoir une amélioration des performances. Также использование ES6 вместо ES5 является гораздо лучшим подходом. Для этого это улучшенный код:

 const arrayWithoutFastest = (() => { const isArray = canBeArray => ('isArray' in Array) ? Array.isArray(canBeArray) : Object.prototype.toString.call(canBeArray) === '[object Array]'; let mapIncludes = (map, key) => map.has(key); let objectIncludes = (obj, key) => key in obj; let includes; function arrayWithoutFastest(arr, ...thisArgs) { let withoutValues = isArray(thisArgs[0]) ? thisArgs[0] : thisArgs; if (typeof Map !== 'undefined') { withoutValues = withoutValues.reduce((map, value) => map.set(value, value), new Map()); includes = mapIncludes; } else { withoutValues = withoutValues.reduce((map, value) => { map[value] = value; return map; } , {}); includes = objectIncludes; } const arrCopy = []; const length = arr.length; for (let i = 0; i < length; i++) { // If value is not in exclude list if (!includes(withoutValues, arr[i])) { arrCopy.push(arr[i]); } } return arrCopy; } return arrayWithoutFastest; })(); 

Comment utiliser:

 const arr = [1,2,3,4,5,"name", false]; arrayWithoutFastest(arr, 1); // will return array [2,3,4,5,"name", false] arrayWithoutFastest(arr, 'name'); // will return [2,3,4,5, false] arrayWithoutFastest(arr, false); // will return [2,3,4,5] arrayWithoutFastest(arr,[1,2]); // will return [3,4,5,"name", false]; arrayWithoutFastest(arr, {bar: "foo"}); // will return the same array (new copy) 

В настоящее время я пишу сообщение в блоге, в котором проверил несколько решений для Array без проблем и сравнил время, необходимое для запуска. Я дополню этот ответ ссылкой, как только закончу этот пост. Просто чтобы вы знали, я сравнил вышеупомянутое с lodash без, и если браузер поддерживает Map , он превосходит lodash! Обратите внимание, что я не использую Array.prototype.indexOf или Array.prototype.includes поскольку обертывание exlcudeValues в Map или Object ускоряет выполнение запросов!

15
ответ дан Ardi 28 янв. '14 в 17:44 2014-01-28 17:44
  Array.prototype.removeItem = function(a) { for (i = 0; i < this.length; i++) { if (this[i] == a) { for (i2 = i; i2 < this.length - 1; i2++) { this[i2] = this[i2 + 1]; } this.length = this.length - 1 return; } } } var recentMovies = ['Iron Man', 'Batman', 'Superman', 'Spiderman']; recentMovies.removeItem('Superman'); 
13
ответ дан Don Vincent Preziosi 26 сент. '13 в 3:12 2013-09-26 03:12
  • 1
  • 2
  • 3

Другие вопросы по меткам или Задайте вопрос