2012-04-06 55 views
0

我有兩個數組:如何查找array1中不在array1中的元素?

var a1 = [ { ID: 2, N:0 }, { ID: 1, N:0 } ]; 
var a2 = [ { ID: 1, N:0 }, { ID: 2, N:0 }, { ID: 3, N:0 } ]; 

我需要得到那些在a2的所有元素,但不是在a1。這裏的元素與另一個元素的區別僅在於屬性ID,其他屬性應該被忽略。而且我無法保證陣列上元素的順序。這意味着這個例子的結果應該是:

var result = [ { ID: 3, N:0 } ]; // result for the example above 

我怎樣才能以有效的方式做到這一點? (我會比較陣列500〜5000長度)

回答

3

爲了有效地做到這一點,你需要建立一個已經在A1中的項目的索引,所以你可以循環a2和每一個比較的指標,看它是否已經看到或沒有。可以使用JavaScript對象作爲索引。循環遍歷a1並將其所有ID都放入索引中。然後在a2中循環並收集ID不在索引中出現的任何項目。

function findUniques(testItems, baseItems) { 
    var index = {}, i; 
    var result = []; 

    // put baseItems id values into the index 
    for (i = 0; i < baseItems.length; i++) { 
     index[baseItems[i].ID] = true; 
    } 

    // now go through the testItems and collect the items in it 
    // that are not in the index 
    for (i = 0; i < testItems.length; i++) { 
     if (!(testItems[i].ID in index)) { 
      result.push(testItems[i]); 
     } 
    } 
    return(result); 
} 

var a1 = [ { ID: 2, N:0 }, { ID: 1, N:0 } ]; 
var a2 = [ { ID: 1, N:0 }, { ID: 2, N:0 }, { ID: 3, N:0 } ]; 

var result = findUniques(a2, a1); 
// [{"ID":3,"N":0}] 

工作演示:http://jsfiddle.net/jfriend00/uDEtg/

0

同樣的問題已經發布了幾次,看看這裏:

JavaScript array difference

大多數解決方案都通過「天然」但是JavaScript的給定。我有時更喜歡使用underscore.js,因爲我使用backbone.js構建了很多東西,下劃線是Backbone的依賴關係。所以我可以使用它的真棒工具。你可能會考慮在加載它們:

http://documentcloud.github.com/underscore/

var a1 = [ { ID: 2, N:0 }, { ID: 1, N:0 } ]; 
var a2 = [ { ID: 1, N:0 }, { ID: 2, N:0 }, { ID: 3, N:0 } ]; 

var from, to; 
if(a1 > a2){ 
    from = a1 
    to = a2 
} else { 
    from = a2 
    to = a1 
} 

var a3 = _.filter(from, function(obj){ 
    var compare = _.find(to, function(obj2){ return obj.ID === obj2.ID }); 
    return compare === undefined 
}); 
console.log(a3); 

我首先確定最長的陣列,我這樣做是因爲我想盡可能多的對象可能比較短名單。否則,我們會'忘記'一些。

然後,我只是使用過濾器,並找到在underscore.js庫返回不屬於短陣中,但較長的陣列中的對象。

如果兩個數組的長度相等,那麼也可以,因爲那樣我們會將所有的項目與所有其他項目進行比較。

+0

我剛剛意識到_.difference是不能解決問題的。你可能會發現我的編輯更好,但仍然使用underscore.js。 – Mosselman 2012-04-06 20:37:56