如何无需指定过滤器数量动态声明筛选条件以筛选product_id?
动态多条件筛选产品ID
需求:从给定的属性数据中,筛选出同时满足所有动态过滤条件的产品ID,过滤条件的数量不固定。
示例数据
var data = [ {attribute_id: 1, attribute_value_id: 1, product_id: 2}, {attribute_id: 2, attribute_value_id: 8, product_id: 2}, {attribute_id: 3, attribute_value_id: 14, product_id: 2}, {attribute_id: 1, attribute_value_id: 1, product_id: 3}, {attribute_id: 2, attribute_value_id: 8, product_id: 3}, {attribute_id: 3, attribute_value_id: 15, product_id: 3}, {attribute_id: 1, attribute_value_id: 1, product_id: 4}, {attribute_id: 2, attribute_value_id: 8, product_id: 4}, {attribute_id: 3, attribute_value_id: 17, product_id: 4}, {attribute_id: 1, attribute_value_id: 1, product_id: 5}, {attribute_id: 2, attribute_value_id: 8, product_id: 5}, {attribute_id: 3, attribute_value_id: 18, product_id: 5}, {attribute_id: 1, attribute_value_id: 1, product_id: 6}, {attribute_id: 2, attribute_value_id: 9, product_id: 6}, {attribute_id: 3, attribute_value_id: 14, product_id: 6}, {attribute_id: 1, attribute_value_id: 1, product_id: 7}, {attribute_id: 2, attribute_value_id: 9, product_id: 7}, {attribute_id: 3, attribute_value_id: 15, product_id: 7}, {attribute_id: 1, attribute_value_id: 1, product_id: 8}, {attribute_id: 2, attribute_value_id: 9, product_id: 8}, {attribute_id: 3, attribute_value_id: 17, product_id: 8}, {attribute_id: 1, attribute_value_id: 1, product_id: 9}, {attribute_id: 2, attribute_value_id: 9, product_id: 9}, {attribute_id: 3, attribute_value_id: 18, product_id: 9}, {attribute_id: 1, attribute_value_id: 1, product_id: 10}, {attribute_id: 2, attribute_value_id: 10, product_id: 10}, {attribute_id: 3, attribute_value_id: 14, product_id: 10}, {attribute_id: 1, attribute_value_id: 1, product_id: 11}, {attribute_id: 2, attribute_value_id: 10, product_id: 11}, {attribute_id: 3, attribute_value_id: 15, product_id: 11}, {attribute_id: 1, attribute_value_id: 1, product_id: 12}, {attribute_id: 2, attribute_value_id: 10, product_id: 12}, {attribute_id: 3, attribute_value_id: 17, product_id: 12}, {attribute_id: 1, attribute_value_id: 1, product_id: 13}, {attribute_id: 2, attribute_value_id: 10, product_id: 13}, {attribute_id: 3, attribute_value_id: 18, product_id: 13}, {attribute_id: 1, attribute_value_id: 2, product_id: 14}, {attribute_id: 2, attribute_value_id: 8, product_id: 14}, {attribute_id: 3, attribute_value_id: 14, product_id: 14}, {attribute_id: 1, attribute_value_id: 2, product_id: 15}, {attribute_id: 2, attribute_value_id: 8, product_id: 15}, {attribute_id: 3, attribute_value_id: 15, product_id: 15}, {attribute_id: 1, attribute_value_id: 2, product_id: 16}, {attribute_id: 2, attribute_value_id: 8, product_id: 16}, {attribute_id: 3, attribute_value_id: 17, product_id: 16}, {attribute_id: 1, attribute_value_id: 2, product_id: 17}, {attribute_id: 2, attribute_value_id: 8, product_id: 17}, {attribute_id: 3, attribute_value_id: 18, product_id: 17}, {attribute_id: 1, attribute_value_id: 2, product_id: 18}, {attribute_id: 2, attribute_value_id: 9, product_id: 18}, {attribute_id: 3, attribute_value_id: 14, product_id: 18}, {attribute_id: 1, attribute_value_id: 2, product_id: 19}, {attribute_id: 2, attribute_value_id: 9, product_id: 19}, {attribute_id: 3, attribute_value_id: 15, product_id: 19}, {attribute_id: 1, attribute_value_id: 2, product_id: 20}, {attribute_id: 2, attribute_value_id: 9, product_id: 20}, {attribute_id: 3, attribute_value_id: 17, product_id: 20}, {attribute_id: 1, attribute_value_id: 2, product_id: 21}, {attribute_id: 2, attribute_value_id: 9, product_id: 21}, {attribute_id: 3, attribute_value_id: 18, product_id: 21}, {attribute_id: 1, attribute_value_id: 2, product_id: 22}, {attribute_id: 2, attribute_value_id: 10, product_id: 22}, {attribute_id: 3, attribute_value_id: 14, product_id: 22}, {attribute_id: 1, attribute_value_id: 2, product_id: 23}, {attribute_id: 2, attribute_value_id: 10, product_id: 23}, {attribute_id: 3, attribute_value_id: 15, product_id: 23}, {attribute_id: 1, attribute_value_id: 2, product_id: 24}, {attribute_id: 2, attribute_value_id: 10, product_id: 24}, {attribute_id: 3, attribute_value_id: 17, product_id: 24}, {attribute_id: 1, attribute_value_id: 2, product_id: 25}, {attribute_id: 2, attribute_value_id: 10, product_id: 25}, {attribute_id: 3, attribute_value_id: 18, product_id: 25} ]
动态过滤条件示例
var filter = [ {attribute_id: 1, attribute_value_id: 1}, {attribute_id: 2, attribute_value_id: 9}, {attribute_id: 3, attribute_value_id: 14} ]
解决方案
步骤思路
- 按产品ID聚合属性:把分散的属性数据按
product_id分组,用Map存储每个产品的属性ID与对应值的映射,提升后续条件校验效率。 - 批量校验所有过滤条件:对每个产品的属性集合,检查是否满足所有过滤条件(只要有一个条件不满足,就排除该产品)。
- 提取符合条件的产品ID:收集所有通过校验的产品ID。
代码实现
// 1. 按product_id聚合属性 const groupedProducts = data.reduce((acc, item) => { const { product_id, attribute_id, attribute_value_id } = item; if (!acc[product_id]) { acc[product_id] = new Map(); } acc[product_id].set(attribute_id, attribute_value_id); return acc; }, {}); // 2. 筛选满足所有过滤条件的产品ID const validProductIds = Object.keys(groupedProducts).filter(id => { const attrMap = groupedProducts[id]; return filter.every(condition => { const { attribute_id, attribute_value_id } = condition; return attrMap.has(attribute_id) && attrMap.get(attribute_id) === attribute_value_id; }); }); console.log(validProductIds); // 输出: ['6']
说明
- 适配动态条件:不管过滤条件数组有多少条,代码逻辑无需修改,自动适配。
- 高效校验:用
Map存储属性映射,查找速度快;every方法确保所有条件必须同时满足。
内容的提问来源于stack exchange,提问作者maXXis
相关产品推荐
相关产品推荐

