Si no necesita la coerción de tipo (debido al uso de indexOf
), puede intentar algo como lo siguiente:
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);
Donde arr
contiene los elementos de destino. Al final, found
se mostrará si la segunda matriz tenía al menos una coincidencia contra el objetivo.
Por supuesto, puede intercambiar números por cualquier cosa que desee usar: las cadenas están bien, como su ejemplo.
Y en mi ejemplo específico, el resultado debería ser true
porque la segunda matriz 3
existe en el objetivo.
ACTUALIZAR:
Así es como lo organizaría en una función (con algunos cambios menores de antes):
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/
En este caso, la función podría modificarse para targetArray
pasarla como argumento en lugar de codificarse en el cierre.
ACTUALIZACIÓN2:
Si bien mi solución anterior puede funcionar y ser (con suerte más) legible, creo que la "mejor" forma de manejar el concepto que describí es hacer algo un poco diferente. El "problema" con la solución anterior es que el indexOf
interior del bucle hace que la matriz de destino se repita completamente para cada elemento de la otra matriz. Esto se puede "arreglar" fácilmente mediante el uso de una "búsqueda" (un mapa ... un literal de objeto JavaScript). Esto permite dos bucles simples, sobre cada matriz. Aquí hay un ejemplo:
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/
La desventaja de esta solución es que solo se pueden usar (correctamente) números y cadenas (y booleanos), porque los valores se convierten (implícitamente) en cadenas y se establecen como las claves del mapa de búsqueda. Esto no es exactamente bueno / posible / fácil de hacer para valores no literales.
for
bucle e itere sobre la matriz de destino. Si cada elemento está contenido dentro de la matriz actual (usocurrent.indexOf(elem) !== -1)
, entonces están todos allí.