Wenn Sie (aufgrund der Verwendung von indexOf) keinen Typenzwang benötigen , können Sie Folgendes versuchen:
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);
Wo arrenthält die Zielelemente. Am Ende foundwird angezeigt, ob das zweite Array mindestens eine Übereinstimmung mit dem Ziel hatte.
Natürlich können Sie Zahlen gegen alles austauschen, was Sie verwenden möchten - Zeichenfolgen sind in Ordnung, wie in Ihrem Beispiel.
In meinem speziellen Beispiel sollte das Ergebnis sein, truedass das zweite Array 3im Ziel vorhanden ist.
AKTUALISIEREN:
So würde ich es in eine Funktion organisieren (mit einigen geringfügigen Änderungen gegenüber zuvor):
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;
}());
DEMO: http://jsfiddle.net/u8Bzt/
In diesem Fall könnte die Funktion so geändert werden, dass targetArraysie als Argument übergeben wird, anstatt im Abschluss fest codiert zu werden.
UPDATE2:
Während meine obige Lösung möglicherweise funktioniert und (hoffentlich besser) lesbar ist, glaube ich, dass der "bessere" Weg, mit dem von mir beschriebenen Konzept umzugehen, darin besteht, etwas anderes zu tun. Das "Problem" bei der obigen Lösung besteht darin, dass das indexOfZielarray innerhalb der Schleife für jedes Element im anderen Array vollständig durchlaufen wird. Dies kann leicht durch "Nachschlagen" (eine Karte ... ein JavaScript-Objektliteral) "behoben" werden. Dies ermöglicht zwei einfache Schleifen über jedes Array. Hier ist ein Beispiel:
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;
};
DEMO: http://jsfiddle.net/5Lv9v/
Der Nachteil dieser Lösung ist, dass nur Zahlen und Zeichenfolgen (und Boolesche Werte) (korrekt) verwendet werden können, da die Werte (implizit) in Zeichenfolgen konvertiert und als Schlüssel für die Lookup-Map festgelegt werden. Dies ist für nicht wörtliche Werte nicht gerade gut / möglich / einfach.
forSchleife und iterieren Sie über das Zielarray. Wenn jedes Element im aktuellen Array enthalten ist (verwendencurrent.indexOf(elem) !== -1), dann sind alle darin enthalten.