Je recherche un moyen efficace de supprimer tous les éléments d'un tableau javascript s'ils sont présents dans un autre tableau.
// If I have this array:
var myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
// and this one:
var toRemove = ['b', 'c', 'g'];
Je souhaite opérer sur myArray pour le laisser dans cet état: ['a', 'd', 'e', 'f']
Avec jQuery, j'utilise grep()
et inArray()
, ce qui fonctionne bien:
myArray = $.grep(myArray, function(value) {
return $.inArray(value, toRemove) < 0;
});
Existe-t-il un moyen pur javascript de le faire sans boucle ni épissage?
javascript
arrays
Robinet
la source
la source
.filter()
. À la place, vous utiliserez desfor
boucles. Vous pouvez éviter.splice()
si la commande d'origine n'a pas besoin d'être maintenue. Ou il existe des moyens de rendre.splice()
plus efficace si vous pensez qu'il y aura de nombreux éléments à supprimer.Réponses:
Utilisez la
Array.filter()
méthode:Petite amélioration, car la prise en charge du navigateur pour
Array.includes()
a augmenté:Prochaine adaptation à l'aide des fonctions flèches :
la source
.difference()
ce qui fait essentiellement cela.toRemove()
en majuscules et modifiez le rappel deel
àel.toUpperCase()
.myArray = myArray.filter( el => !toRemove.includes( el ) );
La
filter
méthode devrait faire l'affaire:Si votre
toRemove
tableau est grand, ce type de modèle de recherche peut être inefficace. Il serait plus performant de créer une carte pour que les recherches soientO(1)
plutôt queO(n)
.la source
Si vous utilisez un tableau d'objets. Ensuite, le code ci-dessous devrait faire la magie, où une propriété d'objet sera le critère pour supprimer les éléments en double.
Dans l'exemple ci-dessous, les doublons ont été supprimés en comparant le nom de chaque élément.
Essayez cet exemple. http://jsfiddle.net/deepak7641/zLj133rh/
la source
Lodash a également une fonction utilitaire pour cela: https://lodash.com/docs#difference
la source
Les ensembles ECMAScript 6 peuvent être utilisés pour calculer les différents éléments de deux tableaux:
la source
Je viens de mettre en œuvre en tant que:
Utilisé comme:
la source
prototypes
des objets natifs, telsArray
. Cela peut avoir un conflit à long terme avec le développement futur de la langue ( voir leflatten
cas )Si vous ne pouvez pas utiliser de nouvelles choses ES5,
filter
je pense que vous êtes coincé avec deux boucles:la source
la source
Maintenant dans la saveur d'une doublure:
Peut ne pas fonctionner sur les anciens navigateurs.
la source
Vous pouvez utiliser _.differenceBy depuis lodash
Exemple de code ici: CodePen
la source
Que diriez-vous du plus simple possible:
la source
includes
n'est pas disponible avant ES7.La bonne façon de supprimer tous les éléments contenus dans un autre tableau consiste à faire du tableau source le même objet en supprimant uniquement les éléments:
Ou équivalent CoffeeScript:
Test à l'intérieur des outils de développement Chrome:
L'utilisation du cadre angulaire est le meilleur moyen de conserver le pointeur sur l'objet source lorsque vous mettez à jour des collections sans une grande quantité d'observateurs et de rechargements.
la source
Je construis la logique sans utiliser de méthodes intégrées, veuillez me faire part de toute optimisation ou modification. J'ai testé dans l'éditeur JS, cela fonctionne bien.
la source