Se você não precisar de coerção de tipo (por causa do uso de indexOf
), tente algo como o seguinte:
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);
Onde arr
contém os itens de destino. No final, found
mostrará se a segunda matriz teve pelo menos uma partida contra o alvo.
Claro, você pode trocar números por qualquer coisa que queira usar - as strings são boas, como no seu exemplo.
E no meu exemplo específico, o resultado deve ser true
porque a segunda matriz 3
existe no destino.
ATUALIZAR:
Aqui está como eu organizaria isso em uma função (com algumas pequenas alterações 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/
Nesse caso, a função pode ser modificada para targetArray
ser passada como argumento em vez de codificada no fechamento.
UPDATE2:
Embora minha solução acima possa funcionar e ser (espero que mais) legível, acredito que a maneira "melhor" de lidar com o conceito que descrevi é fazer algo um pouco diferente. O "problema" com a solução acima é que o indexOf
interior do loop faz com que o array de destino seja repetido completamente para cada item do outro array. Isso pode ser facilmente "consertado" usando uma "pesquisa" (um mapa ... um literal de objeto JavaScript). Isso permite dois loops simples, sobre cada matriz. Aqui está um exemplo:
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/
A desvantagem desta solução é que apenas números e cadeias (e booleanos) podem ser usados (corretamente), porque os valores são (implicitamente) convertidos em cadeias e configurados como as chaves do mapa de pesquisa. Isso não é exatamente bom / possível / fácil para valores não literais.
for
loop e itere sobre a matriz de destino. Se cada elemento está contido dentro da matriz atual (usocurrent.indexOf(elem) !== -1)
, em seguida, eles estão todos lá.