2014-10-20 197 views
0

我有兩個數組:如何從另一個數組中減去一個數組?

var collectionA = [ 
    {'name': 'Brandon', 'age': '41'} 
]; 
var collectionB = [ 
    {'name': 'Brandon', 'age': '41'}, 
    {'name': 'Tom', 'age': '25'}, 
    {'name': 'Jimmy', 'age': '36'}, 
    {'name': 'Brian', 'age': '36'} 
]; 

我怎樣才能創建第三個數組,基本上是減去collectionBcollectionA的結果呢?僅供參考:我在這個項目中使用了Underscore和Backbone,並且很樂意在這個項目中做到這一點。

第三排是這樣的:

var collectionC = [ 
    {'name': 'Tom', 'age': '25'}, 
    {'name': 'Jimmy', 'age': '36'}, 
    {'name': 'Brian', 'age': '36'} 
]; 
+5

注:這裏沒有JSON的一切,你有什麼是JavaScript陣列,JavaScript對象。 JSON是用於表示對象的文本格式。 – Guffa 2014-10-20 17:04:54

+0

沒有像「json數組」那樣的東西。有json字符串可以將數組編碼到它們中。但是你不能按照你想要的方式使用json字符串。您將它們解碼爲本地結構,例如一個javascript數組,然後用這些本機結構做任何你想要的。 – 2014-10-20 17:06:11

+0

第1步是編寫一個函數(或者在你的框架中找到一個函數)來做某種基於屬性的對象比較。兩個具有匹配屬性的對象仍然是兩個對象,所以必須有一個比較器。一旦你得到了,那麼它基本上與簡單字符串或數字列表而不是對象的類似問題相同。 – Pointy 2014-10-20 17:07:31

回答

0

你可以在第二集中使用_.filter_.some一起:

_.filter(collectionB, function(x) { 
    return !_.some(collectionA, function(y) { 
     return y.name == x.name 
    }) 
}); 

或等價使用_.reject

_.reject(collectionB, function(x) { 
    return _.some(collectionA, function(y) { 
     return y.name == x.name 
    }) 
}); 

這可能不是最有效的儘管如此 - 如果你有很大的集合,你可能會想要更優化的東西(例如,首先製作一個哈希映射來加速內部查找)。

0

SOLUTION

var collectionA = [ 
    {'name': 'Brandon', 'age': '41'}, 
    {'name': 'Tom', 'age': '25'}, 
    {'name': 'Jimmy', 'age': '36'}, 
    {'name': 'Brian', 'age': '36'} 
]; 
var collectionB = [ 
    {'name': 'Brandon', 'age': '41'} 
]; 
var subtract = function(a, b){ 
    var r = {}; 
    for(var i in a){ 
    var ai = a[i]; 
    for(var j in b){ 
     var bj = b[j]; 
     if(ai.name != bj.name || ai.age != bj.age){ 
     r[i] = ai; 
     } 
    } 
    } 
    return r; 
}; 

var c = subtract(collectionA,collectionB); 
相關問題