You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需指定过滤器数量动态声明筛选条件以筛选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}
]

解决方案

步骤思路

  1. 按产品ID聚合属性:把分散的属性数据按product_id分组,用Map存储每个产品的属性ID与对应值的映射,提升后续条件校验效率。
  2. 批量校验所有过滤条件:对每个产品的属性集合,检查是否满足所有过滤条件(只要有一个条件不满足,就排除该产品)。
  3. 提取符合条件的产品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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 02:07:01