Si vous n'avez pas besoin de coercition de type (en raison de l'utilisation de indexOf
), vous pouvez essayer quelque chose comme ceci:
var arr = [1, 2, 3];
var check = [3, 4];
var found = false;
for (var i = 0; i < check.length; i++) {
if (arr.indexOf(check[i]) > -1) {
found = true;
break;
}
}
console.log(found);
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 tableau 3
existe dans la cible.
MISE À JOUR:
Voici comment je l'organiserais en fonction (avec quelques modifications mineures par rapport à avant):
var anyMatchInArray = (function () {
"use strict";
var targetArray, func;
targetArray = ["apple", "banana", "orange"];
func = function (checkerArray) {
var found = false;
for (var i = 0, j = checkerArray.length; !found && i < j; i++) {
if (targetArray.indexOf(checkerArray[i]) > -1) {
found = true;
}
}
return found;
};
return func;
}());
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:
var anyMatchInArray = function (target, toMatch) {
"use strict";
var found, targetMap, i, j, cur;
found = false;
targetMap = {};
// Put all values in the `target` array into a map, where
// the keys are the values from the array
for (i = 0, j = target.length; i < j; i++) {
cur = target[i];
targetMap[cur] = true;
}
// Loop over all items in the `toMatch` array and see if any of
// their values are in the map from before
for (i = 0, j = toMatch.length; !found && (i < j); i++) {
cur = toMatch[i];
found = !!targetMap[cur];
// If found, `targetMap[cur]` will return true, otherwise it
// will return `undefined`...that's what the `!!` is for
}
return found;
};
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.
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à.