如何通过比较对象值高效将目标值存入数组?
优化多条件判断下的数组收集逻辑
问题场景
我有两个对象 selectedPlaces(包含A、B、C、D等地点标识,值为布尔型)和 selectedtags(包含temp、hum、growntemp等标签标识,值为布尔型),还有一系列变量:
Atemp.tags[0].tagId、Ahum.tags[0].tagId、Agrowntemp.tags[0].tagId等值分别对应A、B、C、D(注:原代码中.tags.[0]的写法不符合JS语法,修正为.tags[0])
需要每次执行 answerfunc 函数时,根据 selectedPlaces 和 selectedtags 的布尔组合,将符合条件的tagId存入 datas 数组。但当前实现用大量嵌套if判断,重复代码多、维护成本高。
示例规则:
- 当
selectedPlaces.A为true且selectedtags.temp为true时,datas=[Atemp.tags[0].tagId, Ahum.tags[0].tagId, Btemp.tags[0].tagId, Bhum.tags[0].tagId] - 当
selectedPlaces.A、selectedPlaces.B为true,且selectedtags.temp、selectedtags.hum为true时,datas=[Atemp.tags[0].tagId]
原低效实现示例:
// const answerfunc = () => { // let data = [] // if (selectedPlaces.A && !selectedPlaces.B && !selectedPlaces.C && !selectedPlaces.D && selectedtags.temp) { // datas.push(Atemp.tags[0].tagId) // } // // 数百行类似重复判断逻辑 // }
优化方案:抽象规则配置 + 批量匹配
核心思路是把所有判断规则和对应的结果数据抽象成配置对象,通过遍历配置来匹配条件,彻底避免重复的if逻辑。
步骤1:定义规则配置数组
把每个条件组合和对应的目标tagId数组整理成配置项,每个配置项包含两个核心字段:
condition:判断函数,接收selectedPlaces和selectedtags作为参数,返回布尔值表示当前规则是否匹配result:规则匹配成功时,需要存入datas的tagId数组
// 定义所有规则配置,可按需扩展 const rules = [ // 规则1:selectedPlaces.A为true且selectedtags.temp为true { condition: (places, tags) => places.A && tags.temp, result: [ Atemp.tags[0].tagId, Ahum.tags[0].tagId, Btemp.tags[0].tagId, Bhum.tags[0].tagId ] }, // 规则2:selectedPlaces.A、B为true,且selectedtags.temp、hum为true { condition: (places, tags) => places.A && places.B && tags.temp && tags.hum, result: [Atemp.tags[0].tagId] }, // 新增规则直接在此添加即可 ];
步骤2:重构answerfunc函数
遍历规则数组,根据需求收集匹配的结果:如果规则互斥(同一时间仅一个规则生效),则取第一个匹配的结果;如果允许多个规则同时生效,则收集所有匹配的结果。
const answerfunc = () => { let datas = []; // 遍历规则,收集所有匹配的结果 rules.forEach(rule => { if (rule.condition(selectedPlaces, selectedtags)) { datas = [...datas, ...rule.result]; // 若规则互斥,匹配后可直接终止遍历:return; } }); return datas; };
可选优化:简化条件判断
如果selectedPlaces的条件涉及选中数量(比如“仅选中A”),可以封装工具函数简化逻辑:
// 统计selectedPlaces中为true的属性数量 const countSelectedPlaces = (places) => Object.values(places).filter(Boolean).length; // 示例:仅选中A且selectedtags.temp为true的规则 { condition: (places, tags) => countSelectedPlaces(places) === 1 && places.A && tags.temp, result: [Atemp.tags[0].tagId] }
优化优势
- 可维护性:新增/修改规则只需调整
rules数组,无需修改函数核心逻辑 - 可读性:规则与结果一一对应,逻辑清晰直观
- 扩展性:后续新增地点、标签或规则,无需大量复制粘贴重复代码
内容的提问来源于stack exchange,提问作者user19476497
相关产品推荐
相关产品推荐

