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

如何用JS/Lodash按规则过滤深层嵌套的表单数组?

账单交付表单的规则过滤实现方案

核心思路

先将限制规则转换为快速查找映射表,避免每次匹配都遍历规则数组;再逐层遍历嵌套的表单结构,根据映射表的规则过滤需要隐藏的频率选项。

步骤与代码实现

1. 构建规则映射表

把规则数组转成以form-format-frequency为键的对象,这样可以O(1)时间获取对应选项的隐藏状态:

const restrictions = [
  {form: '1', format: '1', frequency: 'D', hide: false},
  {form: '1', format: '2', frequency: 'W', hide: true},
  {form: '2', format: '1', frequency: 'D', hide: true},
  {form: '2', format: '2', frequency: 'W', hide: false},
];

// 生成规则映射表
const restrictionMap = restrictions.reduce((map, rule) => {
  const key = `${rule.form}-${rule.format}-${rule.frequency}`;
  map[key] = rule.hide;
  return map;
}, {});

2. 过滤表单结构

通过逐层遍历+筛选,得到符合规则的新表单结构(不修改原数组,返回新对象):

const forms = [
  {
    value: "1",
    label: 'Email',
    formats: [
      {
        value: '1',
        label: 'PDF',
        frequency: [
          {value: 'D', label: 'Daily'},
          {value: 'W', label: 'Weekly'},
        ],
      },
      {
        value: '2',
        label: 'XML',
        frequency: [{value: 'D', label: 'Daily'}],
      },
    ],
  },
  {
    value: '2',
    label: 'Post',
    formats: [
      {
        value: '1',
        label: 'PDF',
        frequency: [
          {value: 'D', label: 'Daily'},
          {value: 'W', label: 'Weekly'},
        ],
      },
      {
        value: '2',
        label: 'XML',
        frequency: [{value: 'D', label: 'Daily'}],
      },
    ],
  },
];

const filteredForms = forms.map(form => {
  const filteredFormats = form.formats.map(format => {
    // 过滤当前格式下的频率选项:匹配规则且hide为true则移除,否则保留
    const filteredFrequencies = format.frequency.filter(freq => {
      const key = `${form.value}-${format.value}-${freq.value}`;
      return !restrictionMap[key];
    });
    return {...format, frequency: filteredFrequencies};
  });
  return {...form, formats: filteredFormats};
});

3. 结果说明

执行后filteredForms的结构会自动移除符合hide: true的选项:

  • Email表单的PDF格式保留Daily和Weekly选项(规则允许)
  • Post表单的PDF格式移除Daily选项(规则要求隐藏)
  • 无匹配规则的选项默认保留

扩展说明

如果后续需要扩展规则到格式或表单层级(比如隐藏整个格式或表单),只需调整映射表的键结构,再在对应层级添加过滤逻辑即可。

内容的提问来源于stack exchange,提问作者Vít Paník

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 21:52:52