如何用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
相关产品推荐
相关产品推荐

