Для поиска элементов одного массива внутри другого можно использовать indexOf() для цели поиска и запустить цикл для других элементов массива и на каждом шаге проверить существование. Это тривиально, и мои знания в Javascript тоже. Может ли кто-нибудь предложить более эффективный способ? Может быть, может помочь даже встроенный метод языка? Хотя я не мог использовать такой метод, используя Google.javascript проверяет существование элементов 1 массива внутри другого
ответ
Массивы JavaScript не имеют метода, который выполняет пересечения. Различные библиотеки предоставляют методы для этого (путем циклизации массива, как вы описали), включая Underscore и PrototypeJS (и другие, я уверен).
Вы можете использовать Array.filter() внутри и реализовать функцию на прототипе Array, которая возвращает элементы, которые являются общими для обоих.
Array.prototype.common = function(a) {
return this.filter(function(i) {
return a.indexOf(i) >= 0;
});
};
alert([1,2,3,4,5].common([4,5,6])); // "4, 5"
Опять же, как вы упомянули в своем сообщении, эта логика работает также, принимая каждый элемент и проверить, существует ли она в другом.
Это просто красиво. –
@ T.J.Crowder: спасибо, брат :) – mithunsatheesh
для волос более эффективным способом является преобразование одной из массивов в хэш-таблицу, а затем петлю через второй, проверяя наличие элементов в O (1) Время:
a = [1,2,3,4,5]
b = [1,7,3,8,5]
map = {}
a.forEach(function(x) { map[x] = 1 })
intersection = b.filter(function(x) { return map[x] === 1 })
document.write(JSON.stringify(intersection))
Это работает только в том случае, если элементы, о которых идет речь, являются примитивами. Для массивов объектов вы должны прибегнуть к методу indexOf
.
ES6 ("Гармония") не поддерживает Set
, но странно не установлены операции (объединение, пересечение и т.д.), поэтому они должны быть закодированы вручную:
// Firefox only
a = [1,2,3,4,5]
b = [1,7,3,8,5]
sa = new Set(a)
sb = new Set(b)
sa.forEach(function(x) {
if (!sb.has(x))
sa.delete(x);
});
document.write(uneval([...sa]))
'indexOf' является вероятно, так же эффективны, как вам нужно, но есть и другие методы, упомянутые в http://stackoverflow.com/questions/1885557/simplest-code-for-array-intersection-in-javascript и, возможно, на http://stackoverflow.com/questions/11076067/find-matches-between-multiple-javascript-массивы – Rhumborl
Вы должны использовать 'i ndexOf' или цикл для надежного решения кросс-браузера. Существуют такие методы, как jQuery (например, 'inArray'), но они также используют их. – Diode