如何使用underscore.js基于另一个集合过滤集合

时间:2016-08-08 09:39:01

标签: backbone.js underscore.js

我有一个名为`mainItems``

的集合
this.mainItems;

包含18个型号。还有一个包含所选项目的集合对象:

this.seletedItems;

我需要根据其他集合过滤主集合对象。

我尝试过以下方法:

    var that = this;
    var model = _.reject(that.filteredItems.models, function(model1){
        return _.filter(that.collection.models, function(model2) {
           return model1.id == model2.id;
        });
    });

但这种方法无法正常工作。是否可以通过避免第二次迭代来过滤主要项目?

请帮忙!

2 个答案:

答案 0 :(得分:2)

您可以使用Backbone代理的Underscore方法来简化过滤器。

例如,要列出mainItems中没有selectedItems模型的模型,您可以使用

// reject the models found in selectedItems
var filtered = mainItems.reject(function(m) {
    return selectedItems.get(m.id);
});

请注意Collection.get是哈希查找,在评论中将其作为@GruffBunny所指向的the answer的Backbone。

和演示

var mainItems = new Backbone.Collection([
    {id: 1},
    {id: 2},
    {id: 3},
    {id: 4}
]);

var selectedItems = new Backbone.Collection([
    {id: 2}
]);

var keep = mainItems.reject(function(m) {
    return selectedItems.get(m.id);
});

console.log(_.pluck(keep, 'id'));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script>

答案 1 :(得分:0)

您可以使用difference获取未选中的所有模型。

&#13;
&#13;
var mainItems = [{ a: 1 }, { b: 2 }, { c: 3 }];
var selectedItems = mainItems.slice(1);

console.log(_.difference(mainItems, selectedItems));
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
&#13;
&#13;
&#13;