我如何比较骨干中的两个集合?
我有两个集合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);
}
});
});
但它不起作用。有什么想法吗?
答案 0 :(得分: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());
现在将提供预期结果
答案 1 :(得分:4)
我猜测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);
}
});
});
答案 2 :(得分:1)
proxied Underscore methods可以帮到你。尝试:
2C.without(1C.models);
without
和其他代理方法返回数组,因此您必须将结果包装在另一个Backbone.Collection
中。
答案 3 :(得分: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同步。
答案 4 :(得分:1)
这对我有用:
2C.remove(1C.models);
(如果模型ID是比较检查的基础)
答案 5 :(得分:0)
此代码https://github.com/3-16/Backbone-poller/blob/master/pusher.js中的函数updateCollection非常适合我比较两个集合。
答案 6 :(得分: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
}
});