2015-10-06 62 views
1

我想檢查兩個數組是否共享元素,無論順序如何。檢查數組是否包含共享元素,無論索引如何

鑑於

array A: ['hello', 'how', 'are', 'you'] 

array B: ['how', 'are', 'hello'] 

將返回匹配的 '你好', '如何' 和 '是'

好像有東西PHP,array_intersect()Check if array contains elements having elements of another array),但沒有爲JavaScript。

我會用in如果值在一個對象,但他們並不:

if (key in obj) { 

} 

我還可以做array.sort()到兩個數組,但它不能保證兩個數組將有相同數量的值。因此,即使它們被排序,比較指數也將被關閉。

我怎樣才能做到這一點在JavaScript?

回答

2

可以使用filter來檢查相同的元素存在於其他陣列英寸

var arr1 = ['hello', 'how', 'are', 'you']; 
 
var arr2 = ['how', 'are', 'hello']; 
 

 
var commonElements = arr1.filter(function(e) { 
 
    return arr2.indexOf(e) > -1; 
 
}); 
 

 
console.log(commonElements);

您還可以在陣列的原型定義此功能

Array.prototype.intersection = function(arr) { 
 
    return this.filter(function(e) { 
 
    return arr.indexOf(e) > -1; 
 
    }); 
 
}; 
 

 
var arr1 = ['hello', 'how', 'are', 'you'], 
 
    arr2 = ['how', 'are', 'hello']; 
 

 
var commonElements = arr1.intersection(arr2); 
 
console.log(commonElements);

0

考慮性能我想轉換陣列中的一個對象,並然後通過遍歷另一個來檢查十字路口。

var arr1 = ['hello', 'how', 'are', 'you']; 
var arr2 = ['how', 'are', 'hello']; 
var set = {}; 
var intersect = []; 
for (var i = 0; i < arr1.length; i++) 
    set[arr1[i]] = true; 
for (var i = 0; i < arr2.length; i++) 
    if (set[arr2[i]]) intersect.push(arr2[i]); 

但是這種方法會忽略數組中的重複項。與過濾器和找到解決方案相比,這可能看起來很冗長。如果你正在做大數組的交集,這可能會有所幫助。

+0

'for ... in' on Array? – Kaiido

+0

@Kaiido你可以使用'for(..; ..; ..)',如果你對此更加適應,但'for ... in'可以用在數組上。 – TwilightSun

+0

@Kaiido好吧,我不確定舊版瀏覽器。但是如果你沒有添加任何其他非數字屬性到數組中,大多數瀏覽器都不會這樣做。 – TwilightSun

相關問題