比较骨干中的两个集合

时间:2012-05-22 09:50:02

标签: backbone.js

我如何比较骨干中的两个集合?

我有两个集合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);
     }
  });
});

但它不起作用。有什么想法吗?

7 个答案:

答案 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
         }
    });