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

如何基于动态数组a的条件过滤动态数组b得到目标数组c?

基于动态条件数组过滤另一个动态结构数组的实现

需求描述

需要实现逻辑:用数组a的条件过滤数组b得到目标数组c,核心约束如下:

  • 数组a的每个元素包含inputList数组,每个inputList是一组匹配条件
  • 数组b的结构动态可变,键名可能随时变更(比如从Size/Weight变为Color/Styles)
  • b中的元素只要匹配a中任意一个inputList的所有值,就保留到c中

示例输入与预期输出

// 示例输入
const a = [
  { inputList: ['S','600 gram'] },
  { inputList: ['X','800 gram'] }
];

const b = [
  {Size: 'S', productVariantId: '8cb8eaed-7310-41a5-a717-8ccc6694c52c', Weight: '600 gram'},
  {Size: 'S', productVariantId: 'a2c3b56f-075f-4c65-8f5c-a0cd188a735b', Weight: '800 gram'},
  {Size: 'X', productVariantId: '8cb8eaed-7310-41a5-a717-8ccc6694c52c', Weight: '600 gram'},
  {Size: 'X', productVariantId: 'a2c3b56f-075f-4c65-8f5c-a0cd188a735b', Weight: '800 gram'}
];

// 预期输出c
// [
//   {Size: 'S', productVariantId: '8cb8eaed-7310-41a5-a717-8ccc6694c52c', Weight: '600 gram'},
//   {Size: 'X', productVariantId: 'a2c3b56f-075f-4c65-8f5c-a0cd188a735b', Weight: '800 gram'}
// ]

动态结构适配示例:

// 当b的键名变更时,逻辑仍需生效
const dynamicB = [
  {Color: 'S', productVariantId: '8cb8eaed-7310-41a5-a717-8ccc6694c52c', Styles: '600 gram'},
  {Color: 'X', productVariantId: 'a2c3b56f-075f-4c65-8f5c-a0cd188a735b', Styles: '800 gram'}
];
// 预期仍能匹配得到对应元素

实现方案

核心思路

由于结构动态,不能硬编码键名,核心逻辑围绕值匹配展开:

  1. 提取a中所有条件组,得到二维条件数组
  2. 遍历b的每个元素,检查其所有值是否包含任意一个条件组的全部项
  3. 满足匹配条件的元素纳入结果数组

代码实现

function filterDynamicArrays(a, b) {
  // 提取所有条件组
  const conditions = a.map(item => item.inputList);
  
  return b.filter(item => {
    // 获取当前元素的所有值(忽略键名)
    const itemValues = Object.values(item);
    // 检查是否匹配任意一个条件组
    return conditions.some(condition => {
      // 条件组的每一项都需在元素值中存在
      return condition.every(val => itemValues.includes(val));
    });
  });
}

// 测试示例
const a = [
  { inputList: ['S','600 gram'] },
  { inputList: ['X','800 gram'] }
];

const b = [
  {Size: 'S', productVariantId: '8cb8eaed-7310-41a5-a717-8ccc6694c52c', Weight: '600 gram'},
  {Size: 'S', productVariantId: 'a2c3b56f-075f-4c65-8f5c-a0cd188a735b', Weight: '800 gram'},
  {Size: 'X', productVariantId: '8cb8eaed-7310-41a5-a717-8ccc6694c52c', Weight: '600 gram'},
  {Size: 'X', productVariantId: 'a2c3b56f-075f-4c65-8f5c-a0cd188a735b', Weight: '800 gram'}
];

const c = filterDynamicArrays(a, b);
console.log(c); // 输出符合预期的结果

// 测试动态结构的b
const dynamicB = [
  {Color: 'S', productVariantId: '8cb8eaed-7310-41a5-a717-8ccc6694c52c', Styles: '600 gram'},
  {Color: 'X', productVariantId: 'a2c3b56f-075f-4c65-8f5c-a0cd188a735b', Styles: '800 gram'},
  {Color: 'M', productVariantId: '12345', Styles: '500 gram'}
];

const dynamicC = filterDynamicArrays(a, dynamicB);
console.log(dynamicC); // 输出前两个匹配元素

扩展说明

  • 如果需要模糊匹配,可将includes替换为indexOf !== -1或正则匹配逻辑
  • 自动适配条件组长度:若inputList包含3个值,则检查元素是否包含全部3个值
  • 自动忽略无需匹配的字段(如示例中的productVariantId),仅关注值的存在性

内容的提问来源于stack exchange,提问作者Chung Hoàng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:35:51