J'aimerais comprendre la meilleure façon de filtrer un tableau de tous les éléments d'un autre . J'ai essayé avec la fonction de filtre, mais je ne sais pas comment lui donner les valeurs que je souhaite supprimer.
Quelque chose comme:
var array = [1,2,3,4];
var anotherOne = [2,4];
var filteredArray = array.filter(myCallback);
// filteredArray should now be [1,3]
function myCallBack(){
return element ! filteredArray;
//which clearly can't work since we don't have the reference <,<
}
au cas où la fonction de filtre ne serait pas utile, comment l'implémenteriez-vous?
Edit: j'ai vérifié la question en double possible, et cela pourrait être utile pour ceux qui comprennent facilement javascript. La réponse vérifiée comme bonne facilite les choses.
javascript
arrays
filter
Koop4
la source
la source
return arrTwo.indexOf(e) === -1;
code:var filteredArr = firstArr.filter(el => secondArr.indexOf(el) === -1);
Réponses:
Vous pouvez utiliser le
this
paramètre de lafilter()
fonction pour éviter de stocker votre tableau de filtres dans une variable globale.la source
this
.this
semble toujours indéfini?! BizarreJe ferais ce qui suit;
la source
const filteredResults = this.state.cards.filter( result => !this.state.filterOut.includes(result.category) )
react : où this.state.cards dans un tableau d'objets et this.state.filterOut est un tableau de valeurs qui correspondent à la clé 'category' dans les objets qui Je voulais supprimer.Dans le rappel, vous vérifiez si chaque valeur de
array
est dansanotherOne
https://jsfiddle.net/0tsyc1sx/
Si vous utilisez
lodash.js
, utilisez_.difference
Démo
Si vous disposez d'un tableau d'objets:
Tableau de démonstration d'objets
Démo diff tableau d'objets avec lodash
la source
id
dansanotherOne_el.id == array_el.id
avec tout ce que la clé que vous avez dans votre propre objet. Vous devriez acquérir des connaissances sur les tableaux et les objets en javascript, cela vous aidera à mieux comprendre la réponsela source
Le code ci-dessous est le moyen le plus simple de filtrer un tableau par rapport à un autre tableau. Les deux tableaux peuvent contenir des objets au lieu de valeurs.
Production:
[3, 6]
la source
Il y a beaucoup de réponses à votre question, mais je ne vois personne utiliser l'expression lambda:
la source
Toutes les solutions ci-dessus "fonctionnent", mais ne sont pas optimales pour les performances et abordent toutes le problème de la même manière qui recherche linéairement toutes les entrées à chaque point en utilisant ) dans la version C / C ++ plus rapide) (où n 1 est le et n 2 est le tableau de filtres), alors que la recherche binaire a une complexité de O (n 1 ceil (log 2 n 2 )) (ceil = round up - to the ceil ing), et, enfin, l'indexOf la recherche a une complexité très variable entre O (n 1 ) et O (n 1 {1,3} , ou {x, 1 | x∈N} Array.prototype.indexOf ou Array.prototype.includes . Une solution beaucoup plus rapide (bien plus rapide même qu'une recherche binaire dans la plupart des cas) consisterait à trier les tableaux et à avancer au fur et à mesure, comme indiqué ci-dessous. Cependant, un inconvénient est que toutes les entrées du tableau doivent être des nombres ou des chaînes. Cependant, la recherche binaire peut dans de rares cas être plus rapide que la recherche linéaire progressive. Ces cas proviennent du fait que ma recherche linéaire progressive a une complexité de O (2n 1 + n 2 ) (seulement O (n 1+ n 2 n 2 ) , en moyenne à O (n 1 ceil (n 2 ÷ 2)) . Ainsi, indexOf ne sera le plus rapide, en moyenne, que dans les cas de (n 1 , n 2 ) égal à {1,2} , . Cependant, ce n'est toujours pas une représentation parfaite du matériel moderne. IndexOf est nativement optimisé dans toute la mesure imaginable dans la plupart des navigateurs modernes, ce qui le rend très soumis aux lois de la prédiction de branche . Ainsi, si nous faisons la même hypothèse sur indexOf que pour la recherche linéaire et binaire progressive - que le tableau est pré-trié - alors, selon les statistiques répertoriées dans le lien, nous pouvons nous attendre à une vitesse d'environ 6x pour IndexOf, en décalant sa complexité entre O (n 1 ÷ 6) et O (n 1 n 2 ), en moyenne à O (n 1 ceil (n 2 7 ÷ 12)) . Enfin, notez que la solution ci-dessous ne fonctionnera jamais avec des objets car les objets en JavaScript ne peuvent pas être comparés par des pointeurs en JavaScript.
Veuillez consulter mon autre article ici pour plus de détails sur l'algorithme de recherche binaire utilisé
Si vous êtes dégoûté par la taille du fichier (que je respecte), vous pouvez sacrifier un peu de performances afin de réduire considérablement la taille du fichier et d'augmenter la maintenabilité.
Pour prouver la différence de vitesse, examinons quelques JSPerfs. Pour filtrer un tableau de 16 éléments , la recherche binaire est environ 17% plus rapide que indexOf tandis que filterArrayByAnotherArray est environ 93% plus rapide que indexOf. Pour filtrer un tableau de 256 éléments , la recherche binaire est environ 291% plus rapide que indexOf tandis que filterArrayByAnotherArray est environ 353% plus rapide que indexOf. Pour filtrer un tableau de 4096 éléments , la recherche binaire est environ 2655% plus rapide que indexOf tandis que filterArrayByAnotherArray est environ 4627% plus rapide que indexOf.
Filtrage inverse (comme une porte ET)
La section précédente a fourni du code pour prendre le tableau A et le tableau B, et supprimer tous les éléments de A qui existent dans B:
Cette section suivante fournira du code pour le filtrage inverse, où nous supprimons tous les éléments de A qui n'existent PAS dans B. Ce processus est fonctionnellement équivalent à ne retenir que les éléments communs à A et B, comme une porte ET:
Voici le code pour le filtrage inverse:
Pour la version plus lente et plus petite du code de filtrage inverse, voir ci-dessous.
la source
L'OA peut également être implémenté dans ES6 comme suit
ES6:
la source
La meilleure description du
filter
fonctionnement est https://developer.mozilla.org/pl/docs/Web/JavaScript/Referencje/Obiekty/Array/filterVous devez simplement conditionner la fonction:
Et vous ne pouvez pas accéder à la valeur de la variable avant qu'elle ne soit affectée
la source
Vous pouvez configurer la fonction de filtre pour itérer sur le "tableau de filtres".
la source
Vous pouvez utiliser le filtre puis pour la fonction de filtre utiliser une réduction du tableau de filtrage qui vérifie et retourne true quand il trouve une correspondance puis inverser au retour (!). La fonction de filtre est appelée une fois par élément du tableau. Vous ne comparez aucun des éléments de la fonction dans votre message.
la source
la source
la source
Un tableau de filtrage plus flexible provenant d'un autre tableau contenant des propriétés d'objet
la source
Vous pouvez écrire une fonction générique filterByIndex () et utiliser l'inférence de type dans TS pour éviter les tracas avec la fonction de rappel:
disons que vous avez votre tableau [1,2,3,4] que vous voulez filtrer () avec les indices spécifiés dans le tableau [2,4].
la fonction byIndex attend la fonction d'élément et un tableau et ressemble à ceci:
le résultat est alors
la source
Les exemples suivants permettent
new Set()
de créer un tableau filtré qui ne contient que des éléments uniques:Tableau avec des types de données primitifs: chaîne, nombre, booléen, nul, non défini, symbole:
Tableau avec des objets comme éléments:
la source
Ci-dessous un exemple
la source
La solution de Jack Giffin est excellente mais ne fonctionne pas pour les tableaux avec des nombres supérieurs à 2 ^ 32. Voici une version rapide et refactorisée pour filtrer un tableau basé sur la solution de Jack, mais cela fonctionne pour les tableaux 64 bits.
la source