Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 比较主干中的两个集合_Backbone.js - Fatal编程技术网

Backbone.js 比较主干中的两个集合

Backbone.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); } }); }); 但它不起作用。有什么想法吗?我可以帮你。尝

如何比较主干中的两个集合

我有两个集合1C contains
1,2,3
,而2C contains
2,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
         }
    });