2014-09-24 113 views
0

爲了在另一個數組中搜索一個數組的元素,可以在搜索目標上使用indexOf(),並在其他數組元素上運行循環,並在每個步驟檢查存在。這是微不足道的,而且我對Javascript的知識也是如此。任何人都可以請建議一個更有效的方法嗎?也許甚至可以使用該語言的內置方法?雖然我無法使用谷歌這樣的方法。javascript檢查是否存在另一個數組中的1個數組

+0

'indexOf'是可能是你需要的高效,但也有一些其他方法提到http://stackoverflow.com/questions/1885557/simplest-code-for-array-intersection-in-javascript和可能在http://stackoverflow.com/questions/11076067 /在-javascript-arrays-finding-matches-between- – Rhumborl 2014-09-24 07:58:21

+0

你必須使用'i ndexOf'或一個可靠的跨瀏覽器解決方案的循環。在像jQuery這樣的框架中有可用的方法(例如'inArray'),但也可以使用相同的方法。 – Diode 2014-09-24 08:01:56

回答

0

JavaScript的數組沒有交叉點的方法。各種庫提供了方法來做到這一點(通過循環你所描述的陣列),包括UnderscorePrototypeJS(以及其他人,我敢肯定)。

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

這真的很漂亮。 – 2014-09-24 08:35:47

+0

@ T.J.Crowder:謝謝兄弟:) – mithunsatheesh 2014-09-24 08:40:17

1

的毛髮更有效的方法是轉換陣列中的一個爲哈希表,然後循環通過第二個,檢查元件的在澳存在(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]))

相關問題