2012-05-22 3 views
1

Как я могу сравнить две коллекции в позвоночнике?Сравнить две коллекции в позвоночнике

У меня есть две коллекции 1С содержит 1,2,3 в то время как 2C содержит 2,4,5 Что я хочу сделать, это удалить 2 из 2С, поскольку 1С уже имеет значение 2 после этого обычно делают коллекцию.

Я попробовал этот

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

Но он не работает. Есть идеи?

ответ

3

рискну предположить, что model1 и model2 являются никогда не совпадают с образцом модели и поэтому никогда не совпадают. Вы пытались сравнить идентификаторы модели или аналогичные? например. 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); 
    } 
    }); 
}); 
+0

Я думаю, что вы можете быть правы. да, они не одинаково одинаковы. но они имеют одинаковое поле категории. будут ли эти ответы не работать при условии ситуации? – jongbanaag

+0

вам нужно будет указать, что вы хотите сравнить на categoryCode, поэтому 'model1.categoryCode == model2.categoryCode' должен это сделать. – lecstor

+0

царапины мой старый комментарий. лол. Я сделал это, но удваивал коллекцию. это означает, что если исходная коллекция [1,2,3] будет отображаться [3,3,3] – jongbanaag

1

proxied Underscore methods может вам помочь. Попробуйте:

2C.without(1C.models); 

without и другие проксируемые методы возвращают массивы, так что вам придется обернуть результат в другом Backbone.Collection.

+0

, что вы имеете в виду надо обернуть результат в другом Backbone.Collection. ?? – jongbanaag

+0

Спасибо, что ваш ответ привел меня к решению, которое я уже просто забыл о некоторых мелких деталях. – jongbanaag

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

которая теперь будет обеспечивать ожидаемый результат

+0

пытался этот, но не работает для меня. _.различие (это.1C, this.2C); не работает – jongbanaag

+0

@ Dreyfus15 Я уверен, что 'this.1C' не дает массив?вышеприведенный метод должен использоваться до создания коллекций. Храните данные где-то, а затем повторно используйте их. – Deeptechtons

+0

есть. я знаю это. так что я сделал это _.difference (1C.toArray(), 2C.toArray()), но ничего не изменилось – jongbanaag

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.

1

Это работает для меня:

2C.remove(1C.models); 

(если модель идентификатор является основой проверки сравнения)

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 
     } 
    }); 
Смежные вопросы