2013-04-01 60 views
1

我在我的JavaScript代碼中有一對數組(我也使用了敲除js),我想獲得一個只包含所有數組的公共對象。從javascript中的數組列表中獲取只有通用對象

我的代碼是這樣的:

Array1 = [{a: 1, b: 'something'}, {a: 2, b: 'something1'},{a: 3, b: 'something3'}]; 

Array2 = [{a: 3, b: 'something3'}, {a: 1, b: 'something'}, {a: 4, b: 'something4'}] 

Array2 = [{a: 3, b: 'something3'}, {a: 1, b: 'something'}, {a: 5, b: 'something5'}] 

所以,從這個數組我想要的共同所有的到一個單一的陣列,這樣的結果會是這樣:

Array4 = [{a: 1, b: 'something'}, {a: 3, b: 'something3'}] 

我不得不提及Array1,Array2和Array3在這樣的另一個陣列內:

Array0 = [Array1, Array2, Array3]; 

我希望y ou可以幫助我,謝謝!

+0

你說的是「common of all」,但是你在結果中包含something3,而只有2個數組。這是一個錯字還是你想添加的東西,如果它在2個數組中? – smerny

+0

哦..我很抱歉,這是一個錯誤..即時糾正現在,謝謝你! –

+0

你有興趣做深度比較的對象嗎?是'{a:1,b:「某物」}「*相同的被引用的對象*每次,或*獨立的對象*具有相同的屬性? – apsillers

回答

2

例如:

Array1 = [{a: 1, b: 'something'}, {a: 2, b: 'something1'},{a: 3, b: 'something3'}]; 
Array2 = [{a: 3, b: 'something3'}, {a: 1, b: 'something'}, {a: 4, b: 'something4'}] 
Array3 = [{a: 3, b: 'something3'}, {a: 1, b: 'something'}, {a: 5, b: 'something5'}] 

all = [Array1, Array2, Array3] 

objects = {} 
counter = {} 

all.map(function(ary, n) { 
    ary.map(function(obj) { 
     var key = JSON.stringify(obj); 
     objects[key] = obj; 
     counter[key] = (counter[key] || 0) | (1 << n); 
    }) 
}) 

intersection = [] 
Object.keys(counter).map(function(key) { 
    if(counter[key] == (1 << all.length) - 1) 
     intersection.push(objects[key]); 
}) 

console.log(intersection) 

的想法是把所有的物體在哈希表中使用他們的JSON表示作爲鍵。

+0

這真的起作用了!謝謝!! –

+0

小心不要在太大的數據集合上運行。 – naugtur

+0

@naugtur:爲什麼?據我所知,性能是線性的。 – georg

0

好像你需要編寫一些自定義代碼來做javascript中的對象比較(類似Object comparison in JavaScript),然後使用數組相交算法(如之前提到的海報之一)來查找常用元素。

相關問題