0

我有一系列车辆范围。每个 Range 都有一个 VehicleModels 数组,其中包含该范围内的模型。IE

骨干模型和集合:

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。即返回具有燃料属性等于“汽油”的车辆模型的所有范围。很容易通过模型属性过滤集合,例如:

filterByFuel: function(fuel){
   return this.models.where({'Fuel': fuel});
}

或者

filterByFuel: function(fuel){
   return this.models.filter(function(vehicle) {
                     return vehicle.get('Fuel') === fuel;
                });
}

但需要在每个 Range 中搜索 VehicleModel 集合,如果匹配则返回Range 。

非常感谢提示。

编辑

我有以下似乎可行的方法,但很好奇是否有更好的方法。下划线“包含”功能似乎是正确的,但无法让它工作:

 models = models.filter(function(range) {
                if (_.where(range.get('VehicleModels'), { 'Fuel': params.fuel }).length > 0)
                    return range;
            });
4

1 回答 1

1

首先,Backbone 不会将嵌套对象视为单独的集合。它们只是数组。

所以当你这样做时:

this.model.get("VehicleModels")

你只会得到一个Array类型对象而不是一个Backbone.Collection.

要过滤普通数组,您应该使用下划线的filter方法。

_.filter( this.model.get("VehicleModels"), function(mod) { /* your condition */ } );

于 2013-02-24T16:51:06.050 回答