2014-09-24 2 views
0

Для поиска элементов одного массива внутри другого можно использовать indexOf() для цели поиска и запустить цикл для других элементов массива и на каждом шаге проверить существование. Это тривиально, и мои знания в Javascript тоже. Может ли кто-нибудь предложить более эффективный способ? Может быть, может помочь даже встроенный метод языка? Хотя я не мог использовать такой метод, используя Google.javascript проверяет существование элементов 1 массива внутри другого

+0

'indexOf' является вероятно, так же эффективны, как вам нужно, но есть и другие методы, упомянутые в http://stackoverflow.com/questions/1885557/simplest-code-for-array-intersection-in-javascript и, возможно, на http://stackoverflow.com/questions/11076067/find-matches-between-multiple-javascript-массивы – Rhumborl

+0

Вы должны использовать 'i ndexOf' или цикл для надежного решения кросс-браузера. Существуют такие методы, как jQuery (например, 'inArray'), но они также используют их. – Diode

ответ

0

Массивы JavaScript не имеют метода, который выполняет пересечения. Различные библиотеки предоставляют методы для этого (путем циклизации массива, как вы описали), включая Underscore и PrototypeJS (и другие, я уверен).

2

Вы можете использовать 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"

Опять же, как вы упомянули в своем сообщении, эта логика работает также, принимая каждый элемент и проверить, существует ли она в другом.

+0

Это просто красиво. –

+0

@ T.J.Crowder: спасибо, брат :) – mithunsatheesh

1

для волос более эффективным способом является преобразование одной из массивов в хэш-таблицу, а затем петлю через второй, проверяя наличие элементов в 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]))