Backbone.js 比较主干中的两个集合
如何比较主干中的两个集合 我有两个集合1C containsBackbone.js 比较主干中的两个集合,backbone.js,Backbone.js,如何比较主干中的两个集合 我有两个集合1C contains1,2,3,而2C contains2,4,5我想做的是从2C中删除2,因为1C在正常渲染集合之后已经有了值2 我试过这个 this.1C.each(function(model1){ this.2C.each(function(model2){ if(model1 === model2){ 2C.remove(model2); } }); }); 但它不起作用。有什么想法吗?我可以帮你。尝
1,2,3
,而2C contains2,4,5
我想做的是从2C中删除2
,因为1C在正常渲染集合之后已经有了值2
我试过这个
this.1C.each(function(model1){
this.2C.each(function(model2){
if(model1 === model2){
2C.remove(model2);
}
});
});
但它不起作用。有什么想法吗?我可以帮你。尝试:
2C.without(1C.models);
不带
和其他代理方法返回数组,因此您必须将结果包装到另一个主干中。集合
您有一个称为差分运算符的东西。你可以像下面那样使用它
var x=u.差([1,2,3,4],[1,2]);
控制台日志(x)//给出[3,4]
在你的情况下,你可能应该这样做
var reducedCollection = _.difference(this.1C.toJSON(),this.2C.toJSON());
现在它将提供预期的结果我冒昧地猜测模型1和模型2从来都不是模型的同一个实例,因此永远不会匹配。您是否尝试过比较型号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);
}
});
});
这段代码中的函数updateCollection非常适合比较两个集合。我编写了一个用于基于事件的集合比较的库。基本上,我认为您可以通过这样的库实现所需的结果(尚未测试此特定案例): GitHub回购协议如下: 让我知道这是否有帮助!此库的附加好处是,如果1C或2C发生更改(添加、删除或重置),如果存在匹配,则会触发事件,从而有效地保持1C和2C的同步。这对我来说很有用:
2C.remove(1C.models);
(如果模型id是比较检查的基础)您所说的必须将结果包装到另一个主干中是什么意思。集合。?谢谢您的回答让我找到了一个解决方案,我已经忽略了一些小细节。我一直在尝试这个解决方案,但对我来说不起作用。\u。差异(这个0.1C,这个0.2C);不working@Dreyfus15我确信
这个.1C
不会给出数组,是吗?在创建集合之前,必须使用上述方法。将数据存储在某个位置,然后重新使用。是的。我知道。所以我所做的是u.difference(1C.toArray(),2C.toArray()),但没有任何改变谢谢你的回答让我找到了一个解决方案,我已经忽略了一些小细节。我想你可能是对的。是的,它们并不完全相同。但它们具有相同的categoryCode字段。如果出现这种情况,这些答案是否有效?您需要指定要在categoryCode上进行比较,因此model1.categoryCode==model2.categoryCode
应该可以。请删除我的旧注释。哈哈,我做了,但把收藏翻了一倍。也就是说,如果原始收藏是[1,2,3],那么它将呈现[3,3,3]谢谢你的回答,我找到了一个解决方案,我刚才忽略了一些小细节。
2C.remove(1C.models);
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
}
});