有没有办法根据可能的属性值数组过滤Backbone集合中的模型?我正在寻找一种表达以下内容的方法:
var results = myCollection.where({id: [0, 1, 2]});
这将返回所有模型的列表,其中id与数组中列出的任何匹配。
更新 对于单个属性,第一个答案看起来很好,但实际上我需要为多个属性执行此操作。所以,上面的例子看起来更像是这样:
var results = myCollection.where({id: [0, 1, 2], quality: [0, 2], strength: ['high']});
答案 0 :(得分:3)
var results = myCollection.where(function(model){
return [0,1,2].some(function(el){
return model.get('id')===el;
});
});
应该有用。
或尝试广泛的聚合框架:(与Backbone兼容)
答案 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;
});
}