Backbone / Underscore过滤多维集合

时间:2013-07-02 18:58:05

标签: javascript backbone.js underscore.js

我目前正在开发Backbone应用程序,并使用骨干表单生成应用程序中使用的一些表单。我有一个带有两个选择框的表单,通过我的API从收集器中提取数据。

这些选择框中的第二个取决于第一个(类别与产品关系)的值。但是,产品可以属于多个类别,因此下划线中的标准_.where不会。

这就是JSON对于某个类别的粗略看法:

{id: 1, name: "Category 1"}

然后这是产品的JSON:

{id: 1, name: "Product 1", categories: [{cat_id: 1},{cat_id: 2}]}

当选择第一个选择值时,我需要一些方法来过滤id。

2 个答案:

答案 0 :(得分:0)

var categoryId = 1; //your selected category id

var filteredProducts = _.filter(products, function (product) {
   return !!_.findWhere(product.categories, {id: categoryId });
});

最差情况效率 - O(n ^ 2)

fiddle

答案 1 :(得分:0)

您可以稍微优化一下数据,以便更容易深入研究:

_.each(products, function(product) {
    product.categoryIds = _.pluck(product.categories, "cat_id");
});

现在,您只需使用以下内容搜索某个cat_id

即可
var result = _.filter(products, function(product) {
    return _.contains(product.categoryIds, cat_id);
});

或者,如果您想使用更多内存但访问速度更快(在进行多项选择时很有用):

var cats = _.reduce(categories, function(map, category) {
    map[category.id] = category;
    category.products = [];
    return map;
}, {});
_.each(products, function(product) {
    _.each(product.categories, function(category) {
        cats[category.cat_id].products.push(product);
    });
});

然后

var result = cats[cat_id].products;