多参数用户过滤问题:单个规则触发Cannot read properties of undefined报错
解决用户过滤规则单独存在时的forEach未定义报错问题
你的代码报错原因很明确:当condition对象里只存在exclude或include其中一个规则时,另一个属性是undefined,直接调用forEach就会触发Cannot read properties of undefined (reading 'forEach')错误。
修复方案
核心思路是在调用forEach前确保目标属性存在,或者给默认空数组,以下两种方法都能解决问题:
方法1:先判断属性是否存在再执行forEach
const data = responseJson.then((data) => { const filteredUsers = advancedFilter(data.data, data.condition); console.log(filteredUsers); }); function advancedFilter(data, condition) { return data.filter((dataItem) => { let cond = true; // 处理exclude规则:先判断是否存在该属性 if (condition.exclude) { condition.exclude.forEach((condItem) => { for (const key in condItem) { cond = cond && dataItem[key] !== condItem[key]; } }); } // 处理include规则:先判断是否存在该属性 if (condition.include) { condition.include.forEach((condItem) => { for (const key in condItem) { cond = cond && dataItem[key] === condItem[key]; } }); } return cond; }); }
方法2:使用空值合并给默认空数组
这种写法更简洁,当属性不存在时用空数组替代,空数组调用forEach不会报错,只是不执行循环:
const data = responseJson.then((data) => { const filteredUsers = advancedFilter(data.data, data.condition); console.log(filteredUsers); }); function advancedFilter(data, condition) { return data.filter((dataItem) => { let cond = true; // 给exclude默认空数组,避免undefined调用forEach (condition.exclude || []).forEach((condItem) => { for (const key in condItem) { cond = cond && dataItem[key] !== condItem[key]; } }); // 给include默认空数组 (condition.include || []).forEach((condItem) => { for (const key in condItem) { cond = cond && dataItem[key] === condItem[key]; } }); return cond; }); }
验证场景
- 仅存在
exclude规则:include为空数组,forEach不执行,正常过滤不符合exclude条件的用户 - 仅存在
include规则:exclude为空数组,forEach不执行,正常过滤符合include条件的用户 - 两个规则同时存在:和原逻辑一致,按先排除再包含的逻辑执行过滤
内容的提问来源于stack exchange,提问作者userName
相关产品推荐
相关产品推荐

