2

バックボーンの2つのコレクションを比較するにはどうすればよいですか?

1Cには2つのコレクションが含まれていますが1,2,3、2Cには含まれています。1Cにはすでに2の値があるため、通常はコレクションをレンダリングした後、2Cから2,4,5削除します。2

私はこれを試しました

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

しかし、それは機能しません。何か案は?

4

7 に答える 7

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());

これで期待される結果が得られます

于 2012-05-22T10:02:37.533 に答える
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);
     }
  });
});
于 2012-05-22T10:07:51.603 に答える
1

プロキシされたアンダースコアメソッドは、ここで役立ちます。試す:

2C.without(1C.models);

without他のプロキシメソッドは配列を返すため、結果を別のでラップする必要がありますBackbone.Collection

于 2012-05-22T09:57:20.000 に答える
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の同期が効果的に維持されることです。

于 2013-09-05T05:04:23.787 に答える
1

これは私のために働きます:

2C.remove(1C.models);

(モデルIDが比較チェックの基礎である場合)

于 2014-05-10T06:06:42.397 に答える
0

このコードhttps://github.com/3-16/Backbone-poller/blob/master/pusher.jsの関数updateCollectionは、 2つのコレクションを比較するのに最適です。

于 2012-12-09T22:15:08.363 に答える
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
         }
    });
于 2016-07-22T10:43:48.193 に答える