我有一系列车辆范围。每个Range都有一个VehicleModel数组,其中包含该范围内的模型。即。
Backbone Model and Collection:
App.Models.Range = Backbone.Models.extend({});
App.Collections.Ranges = Backbone.Collection.extend({
model: Range
});
JSON:
[{
"Name": "Range A",
"VehicleModels": [
{
"Name": "1.2",
"Fuel": "Petrol"
},
{
"Name": "1.3",
"Fuel": "Petrol"
},
{
"Name": "1.6",
"Fuel": "Petrol"
}
]
},
{
"Name": "Range B",
"VehicleModels": [
{
"Name": "x1",
"Fuel": "Diesel"
},
{
"Name": "x2",
"Fuel": "Diesel"
},
{
"Name": "x3",
"Fuel": "Diesel"
}
]
}]
如何过滤集合以返回范围,而不是具有与过滤条件匹配的属性的VehicleModel。即返回所有具有Fuel属性等于'Petrol'的车型的范围。很容易按照以下模型属性过滤集合:
filterByFuel: function(fuel){
return this.models.where({'Fuel': fuel});
}
或
filterByFuel: function(fuel){
return this.models.filter(function(vehicle) {
return vehicle.get('Fuel') === fuel;
});
}
但需要在每个范围内搜索VehicleModel集合,如果匹配则返回范围。
提示非常感谢。
修改
我有以下似乎有效,但如果有更好的方法,我很好奇。下划线“包含”功能似乎是正确的,但无法让它起作用:
models = models.filter(function(range) {
if (_.where(range.get('VehicleModels'), { 'Fuel': params.fuel }).length > 0)
return range;
});
答案 0 :(得分:1)
首先,Backbone不会将嵌套对象视为单独的集合。它们只是数组。
所以当你这样做时:
this.model.get("VehicleModels")
您只会获得Array
类型的对象,而不是Backbone.Collection
。
要过滤普通数组,您应该使用下划线的filter
方法。
_.filter( this.model.get("VehicleModels"), function(mod) { /* your condition */ } );