2012-05-22 47 views
1

我如何比較骨幹中的兩個集合?比較骨幹中的兩個集合

我有兩個集合1C包含1,2,3而2C包含2,4,5我想要做的是從2C刪除2因爲1C已經有後,通常呈現集合值爲2。

我想這

this.1C.each(function(model1){ 
    this.2C.each(function(model2){ 
    if(model1 === model2){ 
     2C.remove(model2); 
    } 
    }); 
}); 

但它不工作。有任何想法嗎?

回答

3

我會大膽地猜測MODEL1和MODEL2是從來不是一個模型的同一個實例,因此永遠不會匹配。你有沒有試過比較模型ID或類似?例如。 model1.id == model2.id

也許添加一些調試,所以你可以看到發生了什麼..

this.1C.each(function(model1){ 
    console.log('m1:'+model1.categoryCode); 
    this.2C.each(function(model2){ 
    console.log(' m2:'+model2.categoryCode); 
    if(model1.categoryCode == model2.categoryCode){ 
     console.log('removing m2:'+model2.categoryCode); 
     2C.remove(model2); 
    } 
    }); 
}); 
+0

我想你可能是對的。是的,他們並不完全相同。但它們具有相同的categoryCode字段。那些答案沒有工作提供的情況? – jongbanaag

+0

您需要指定要在categoryCode上進行比較,因此'model1.categoryCode == model2.categoryCode'應該執行此操作。 – lecstor

+0

劃傷我的舊評論。大聲笑。我做了它,但雙倍收集。這意味着如果原始集合是[1,2,3],它會渲染[3,3,3] – jongbanaag

1

proxied Underscore methods可以幫到你。嘗試:

2C.without(1C.models); 

without和其他代理的方法返回數組,所以你必須包裝的結果另一個Backbone.Collection

+0

。 ?? – jongbanaag

+0

謝謝你的回答讓我想到了一個解決方案,我已經忽略了一些小細節。 – jongbanaag

5

你有所謂的差異運算符http://underscorejs.org/#difference。你可以使用如下

var x = _.difference([1,2,3,4],[1,2]); console.log(x); //gives [3,4]

在你的情況,你可能應該這樣做

var reducedCollection = _.difference(this.1C.toJSON(),this.2C.toJSON()); 

現在將提供預期的結果

+0

一直在嘗試這一個,但不適合我。 _.difference(this.1C,this.2C);不工作 – jongbanaag

+0

@ Dreyfus15我相信'this.1C'不給數組嗎?在創建集合之前必須使用上述方法。將數據存儲在某個地方然後重新使用。 – Deeptechtons

+0

是的。我知道。所以我做了什麼是_.difference(1C.toArray(),2C.toArray()),但沒有任何更改 – jongbanaag

1

我爲基於事件的收集比較編寫了一個庫。基本上,我想你可以實現你正在尋找與此庫,像這樣的結果(沒有測試這種特殊情況下):

cocomp = new Backbone.CoComp({ 
    comparator: function(obj) { 
    obj["1C"] === obj["2C"] 
    } 
}); 

// Listen for "cocomp:in:1C" on the 2C collection. This will be 
// triggered if there is a match based on the comparator above. 
2C.on("cocomp:in:1C", function(value) { 
    2C.remove(value); 
}); 

cocomp.set("1C", 1C) 
cocomp.set("2C", 2C) 

GitHub的回購是在這裏:https://github.com/davidbiehl/backbone.cocomp

讓我知道如果這有助於!這個庫的另一個好處是,如果1C或2C發生改變(添加,刪除或重置),則事件將在匹配時觸發,有效地保持1C和2C同步。

1

這個工作對我來說:

2C.remove(1C.models); 

(如果模型身份證是比較檢查的基礎上),你是什麼意思的有包裝的結果在另一個Backbone.Collection

0
var checked = []; 

arrNewCollection.forEach(function(item){ //get new collection 
     if (!_.findWhere(arrOldCollection, {id: item.id})) { // find in old collection our property 
       checked.push(item.id); // if in old collection can not find property then add this property in array 
     } 
    });