Если вам не нужно приведение типов (из-за использования indexOf
), вы можете попробовать что-то вроде следующего:
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);
Где arr
содержит целевые элементы. В конце found
покажет, имел ли второй массив хотя бы одно совпадение с целью.
Конечно, вы можете поменять числа для всего, что вы хотите использовать - строки в порядке, как ваш пример.
И в моем конкретном примере, результат должен быть, true
потому что второй массив 3
существует в цели.
ОБНОВИТЬ:
Вот как я могу организовать это в функцию (с некоторыми незначительными изменениями по сравнению с предыдущим):
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;
}());
ДЕМО: http://jsfiddle.net/u8Bzt/
В этом случае функцию можно изменить, чтобы targetArray
она передавалась в качестве аргумента, а не была жестко закодирована в замыкании.
UPDATE2:
Хотя мое решение, приведенное выше, может работать и (возможно, более) читабельно, я считаю, что «лучший» способ справиться с описанной мной концепцией - сделать что-то немного по-другому. «Проблема» с вышеприведенным решением состоит в том, что indexOf
внутри цикла происходит полное зацикливание целевого массива для каждого элемента в другом массиве. Это можно легко «исправить» с помощью «поиска» (карта ... литерал объекта JavaScript). Это позволяет использовать два простых цикла для каждого массива. Вот пример:
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;
};
ДЕМО: http://jsfiddle.net/5Lv9v/
Недостатком этого решения является то, что только числа и строки (и логические значения) могут использоваться (правильно), поскольку значения (неявно) преобразуются в строки и задаются в качестве ключей для карты поиска. Это не совсем хорошо / возможно / легко сделать для не буквальных значений.
for
цикл и переберите целевой массив. Если каждый элемент содержится в текущем массиве (используйтеcurrent.indexOf(elem) !== -1)
, тогда они все там.