我目前正在开发Backbone应用程序,并使用骨干表单生成应用程序中使用的一些表单。我有一个带有两个选择框的表单,通过我的API从收集器中提取数据。
这些选择框中的第二个取决于第一个(类别与产品关系)的值。但是,产品可以属于多个类别,因此下划线中的标准_.where
不会。
这就是JSON对于某个类别的粗略看法:
{id: 1, name: "Category 1"}
然后这是产品的JSON:
{id: 1, name: "Product 1", categories: [{cat_id: 1},{cat_id: 2}]}
当选择第一个选择值时,我需要一些方法来过滤id。
答案 0 :(得分:0)
var categoryId = 1; //your selected category id
var filteredProducts = _.filter(products, function (product) {
return !!_.findWhere(product.categories, {id: categoryId });
});
最差情况效率 - O(n ^ 2)
答案 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;