J'ai un tableau cible ["apple","banana","orange"]
et je veux vérifier si d'autres tableaux contiennent l'un des éléments du tableau cible.
Par exemple:
["apple","grape"] //returns true;
["apple","banana","pineapple"] //returns true;
["grape", "pineapple"] //returns false;
Comment puis-je le faire en JavaScript?
javascript
arrays
Alex
la source
la source
for
boucle et parcourez le tableau cible. Si chaque élément est contenu dans le tableau courant (utilisezcurrent.indexOf(elem) !== -1)
, alors ils sont tous là.Réponses:
Vanilla JS
ES2016:
ES6:
Comment ça fonctionne
some(..)
vérifie chaque élément du tableau par rapport à une fonction de test et renvoie vrai si un élément du tableau réussit la fonction de test, sinon, il renvoie faux.indexOf(..) >= 0
etincludes(..)
deux retournent vrai si l'argument donné est présent dans le tableau.la source
true
si un élément du tableau réussit la fonction de test. Sinon, il revientfalse
.[false, false, false]
au lieu d'un tableau vide[]
?vanille js
la source
some()
est rad. Quitte dès que quelque chose correspond.arr.some(v=> haystack.indexOf(v) >= 0)
arr.some(v => haystack.includes(v))
arr1.some(v => arr2.indexOf(v) >= 0)
.includes
, car il n'est apparemment pas pris en charge dans IE: stackoverflow.com/questions/36574351/…Si vous n'êtes pas opposé à l'utilisation d'un libray, http://underscorejs.org/ a une méthode d'intersection, ce qui peut simplifier ceci:
La fonction d'intersection renverra un nouveau tableau avec les éléments auxquels elle correspond et sinon, elle renvoie un tableau vide.
la source
ES6 (le plus rapide)
ES2016
Souligner
DÉMO: https://jsfiddle.net/r257wuv5/
jsPerf: https://jsperf.com/array-contains-any-element-of-another-array
la source
Si vous n'avez pas besoin de coercition de type (en raison de l'utilisation de
indexOf
), vous pouvez essayer quelque chose comme ceci:Où
arr
contient les éléments cibles. À la fin,found
affichera si le deuxième tableau avait au moins un correspondance avec la cible.Bien sûr, vous pouvez échanger des chiffres pour tout ce que vous souhaitez utiliser - les chaînes sont très bien, comme votre exemple.
Et dans mon exemple spécifique, le résultat devrait être
true
dû au fait que le second tableau3
existe dans la cible.MISE À JOUR:
Voici comment je l'organiserais en fonction (avec quelques modifications mineures par rapport à avant):
DÉMO: http://jsfiddle.net/u8Bzt/
Dans ce cas, la fonction peut être modifiée pour
targetArray
être passée en argument au lieu d'être codée en dur dans la fermeture.MISE À JOUR2:
Bien que ma solution ci-dessus puisse fonctionner et être (espérons-le plus) lisible, je pense que la "meilleure" façon de gérer le concept que j'ai décrit est de faire quelque chose d'un peu différemment. Le "problème" avec la solution ci-dessus est que l'
indexOf
intérieur de la boucle provoque le bouclage complet du tableau cible pour chaque élément de l'autre tableau. Cela peut facilement être "corrigé" en utilisant une "recherche" (une carte ... un objet JavaScript littéral). Cela permet deux boucles simples, sur chaque tableau. Voici un exemple:DÉMO: http://jsfiddle.net/5Lv9v/
L'inconvénient de cette solution est que seuls les nombres et les chaînes (et les booléens) peuvent être utilisés (correctement), car les valeurs sont (implicitement) converties en chaînes et définies comme clés de la carte de recherche. Ce n'est pas exactement bon / possible / facile à faire pour les valeurs non littérales.
la source
undefined
... c'est à ça que!!
sert" - c'est faux. Il renverra l'opposition booléenne de!
.Solution ES6:
Contrairement à lui: Must contient toutes les valeurs.
J'espère, sera utile.
la source
Vous pouvez utiliser lodash et faire:
Définir l'intersection se fait sur les deux collections produisant un tableau d'éléments identiques.
la source
intersection
en continuant à comparer même après avoir trouvé le premier match afin de tous les trouver. C'est comme utiliserfilter
quand vous en avez besoinfind
.Utilisation de filter / indexOf :
la source
Ou vous pouvez même avoir de meilleures performances si vous découvrez d'abord lequel de ces deux tableaux est le plus long et que
Set
vous recherchez le tableau le plus long, tout en appliquant lasome
méthode sur le plus court:la source
indexOf
etincludes
, vous êtes le premier à répondre avec la solution basée sur un ensemble plus efficace, en utilisant la nativeSet
, 4 ans après son introduction dans EcmaScript. +1J'ai trouvé cette syntaxe courte et douce pour faire correspondre tout ou partie des éléments entre deux tableaux. Par exemple
// Opération OR. rechercher si l'un des éléments du tableau2 existe dans le tableau1. Cela reviendra dès qu'il y aura une première correspondance car une méthode se casse lorsque la fonction retourne TRUE
// imprime VRAI
// ET opération. trouver si tous les éléments de array2 existent dans array1. Cela reviendra dès qu'il n'y aura pas de première correspondance car une méthode se casse lorsque la fonction retourne TRUE
// imprime FAUX
J'espère que cela aidera quelqu'un à l'avenir!
la source
Vous pouvez utiliser un appel Array.prototype.some imbriqué. Cela présente l'avantage qu'il sera libéré lors du premier match au lieu d'autres solutions qui s'exécuteront dans la boucle imbriquée complète.
par exemple.
la source
Voici un cas intéressant que je pensais devoir partager.
Disons que vous avez un tableau d'objets et un tableau de filtres sélectionnés.
Pour appliquer les filtres sélectionnés à cette structure, nous pouvons
la source
J'ai écrit 3 solutions. Ils font essentiellement la même chose. Ils reviennent vrai dès qu'ils arrivent
true
. J'ai écrit les 3 solutions juste pour montrer 3 façons différentes de faire les choses. Maintenant, cela dépend de ce que vous aimez le plus. Vous pouvez utiliser performance.now () pour vérifier les performances d'une solution ou de l'autre. Dans mes solutions, je vérifie également quelle baie est la plus grande et laquelle est la plus petite pour rendre les opérations plus efficaces.La 3ème solution n'est peut-être pas la plus mignonne mais elle est efficace. J'ai décidé de l'ajouter car dans certaines interviews de codage, vous n'êtes pas autorisé à utiliser des méthodes intégrées.
Enfin, bien sûr ... nous pouvons trouver une solution avec 2 NESTED pour les boucles (à la manière de la force brute) mais vous voulez éviter cela car la complexité temporelle est mauvaise O (n ^ 2) .
Remarque:
indexOf () vs inclut ()
Lequel a de meilleures performances ?
indexOf()
pour un peu, mais comprend est plus lisible à mon avis.Si je ne me trompe pas
.includes()
et queindexOf()
j'utilise des boucles en arrière-plan, vous serez donc à O (n ^ 2) lorsque vous les utiliserez avec.some()
.UTILISATION de la boucle
UTILISATION de .some ()
UTILISATION DES CARTES Complexité temporelle O (2n) => O (n)
Code dans mon: stackblitz
Je ne suis pas un expert en performance ni en BigO, donc si quelque chose que j'ai dit ne va pas, faites le moi savoir.
la source
Qu'en est-il de l'utilisation d'une combinaison de some / findIndex et indexOf?
Donc quelque chose comme ça:
Pour le rendre plus lisible, vous pouvez ajouter cette fonctionnalité à l'objet Array lui-même.
Remarque: Si vous souhaitez faire quelque chose avec un prédicat, vous pouvez remplacer l'indexOf interne par un autre findIndex et un prédicat
la source
Ma solution applique Array.prototype.some () et Array.prototype.includes () qui font également leur travail assez efficacement
ES6
la source
Encore une solution
Vérifiez si a1 contient tous les éléments de a2
la source
Cela peut être fait en parcourant simplement le tableau principal et en vérifiant si un autre tableau contient ou non l'élément cible.
Essaye ça:
DEMO chez JSFIDDLE
la source
Avec underscorejs
la source
indexOf
je pense le contraire :). En revanche, je suis d'accord pour essayer de ne pas ajouter de bibliothèques externes si elles ne sont pas vraiment nécessaires, mais je ne suis pas vraiment obsédé par cela, les bibliothèques tierces offrent non seulement des fonctionnalités utiles mais également des fonctionnalités solides . Par exemple: avez-vous testé tous les cas de bord et navigateurs-maires avec votre solution? .. (soit dit en passant,every
n'essaie pas de trouver un index dans une liste mais évalue quelque chose dans chaque élément de la liste)Ajout au prototype de tableau
Avertissement: Beaucoup déconseillent fortement cela. La seule fois où ce serait vraiment un problème, c'est si une bibliothèque ajoute une fonction prototype avec le même nom (qui se comporte différemment) ou quelque chose comme ça.
Code:
Sans utiliser les fonctions de grosse flèche:
Usage
la source
Vanilla JS avec correspondance partielle et insensible à la casse
Le problème avec certaines approches précédentes est qu'elles nécessitent une correspondance exacte de chaque mot . Mais, que se passe-t-il si vous souhaitez fournir des résultats pour les correspondances partielles?
Ceci est utile lorsque vous souhaitez fournir une zone de recherche dans laquelle les utilisateurs tapent des mots et les résultats peuvent avoir ces mots dans n'importe quel ordre, position et casse.
la source
Mettez à jour la réponse @Paul Grimshaw, utilisez
includes
insteed ofindexOf
pour plus de lisibilitéla source
J'ai trouvé une solution dans le nœud en utilisant des js de soulignement comme ceci:
la source
Personnellement, j'utiliserais la fonction suivante:
La méthode "toString ()" utilisera toujours des virgules pour séparer les valeurs. Ne fonctionnera vraiment qu'avec des types primitifs.
la source
Le tableau .filter () avec un appel imbriqué à .find () renverra tous les éléments du premier tableau qui sont membres du second tableau. Vérifiez la longueur du tableau renvoyé pour déterminer si l'un des deuxièmes tableaux se trouvait dans le premier tableau.
la source
la source
la source