在Backbone Model上过滤单个属性的多个值

时间:2014-03-09 23:52:40

标签: javascript backbone.js

有没有办法根据可能的属性值数组过滤Backbone集合中的模型?我正在寻找一种表达以下内容的方法:

var results = myCollection.where({id: [0, 1, 2]}); 

这将返回所有模型的列表,其中id与数组中列出的任何匹配。

更新 对于单个属性,第一个答案看起来很好,但实际上我需要为多个属性执行此操作。所以,上面的例子看起来更像是这样:

var results = myCollection.where({id: [0, 1, 2], quality: [0, 2], strength: ['high']});

2 个答案:

答案 0 :(得分:3)

var results = myCollection.where(function(model){
    return [0,1,2].some(function(el){
        return model.get('id')===el;
    });
});

应该有用。

或尝试广泛的聚合框架:(与Backbone兼容)

https://www.npmjs.org/package/mingo

答案 1 :(得分:1)

您可以创建一个复杂的filter语句,但您可能想问自己为什么要这样做,以及为什么要在客户端执行此操作。

您是否考虑过对服务器进行查询,或者以更方便的方式重构数据?

从非优化和未经测试的角度来看,您可以执行类似这样的操作,其中您的参数是模型或集合,后跟{key: [val1, val]}对的对象。

function multiFilter(){
    var filters = Array.prototype.slice.call(arguments);
    var model = filters.pop();
    return model.filter(function(m){
        var returnModel = false;
        Object.keys(filters).forEach(function(key){
           if(_.has(model[key], filters[key]){
               returnModel = true;
           } else {
               returnModel = false;
           }
        });
        return returnModel;
    });
 }