Se non hai bisogno della coercizione del tipo (a causa dell'uso di indexOf
), puoi provare qualcosa del tipo seguente:
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);
Dove arr
contiene gli articoli di destinazione. Alla fine, found
mostrerà se il secondo array ha avuto almeno una partita contro il bersaglio.
Ovviamente, puoi scambiare i numeri con tutto ciò che vuoi usare: le stringhe vanno bene, come nel tuo esempio.
E nel mio esempio specifico, il risultato dovrebbe essere true
perché il secondo array 3
esiste nella destinazione.
AGGIORNARE:
Ecco come lo organizzerei in una funzione (con alcune piccole modifiche rispetto a prima):
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 questo caso, la funzione potrebbe essere modificata per targetArray
essere passata come argomento anziché codificata nella chiusura.
UPDATE2:
Mentre la mia soluzione sopra potrebbe funzionare ed essere (si spera più) leggibile, credo che il modo "migliore" di gestire il concetto che ho descritto sia quello di fare qualcosa in modo leggermente diverso. Il "problema" con la soluzione di cui sopra è che l' indexOf
interno del ciclo fa sì che l'array di destinazione venga completamente riavvolto per ogni elemento nell'altro array. Questo può essere facilmente "risolto" utilizzando una "ricerca" (una mappa ... un oggetto JavaScript letterale). Ciò consente due semplici loop, su ciascun array. Ecco un esempio:
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/
L'aspetto negativo di questa soluzione è che solo i numeri e le stringhe (e i booleani) possono essere utilizzati (correttamente), poiché i valori vengono (implicitamente) convertiti in stringhe e impostati come chiavi per la mappa di ricerca. Questo non è esattamente buono / possibile / facilmente eseguibile per valori non letterali.
for
ciclo e scorrere sull'array di destinazione. Se ogni elemento è contenuto nell'array corrente (usacurrent.indexOf(elem) !== -1)
, allora sono tutti lì dentro.