JavaScript数组过滤异常:删除匹配@b.com元素时始终返回空数组求解
问题分析与解决
核心问题:filter回调函数缺少返回值
你的箭头函数用了大括号{},但里面仅写了!e.match(/@b.com/);,没有通过return返回这个表达式的结果。箭头函数在使用大括号包裹代码块时,必须显式声明返回值,否则默认返回undefined。而filter会把undefined判定为false,导致所有元素都被过滤,最终得到空数组。额外优化点:正则与匹配方法的细节
正则里的.是通配符,会匹配任意字符,如果要匹配字面量的.,需要转义成\.,即/@b\.com/。
另外,match方法匹配成功返回数组、失败返回null,用!判断虽然能生效,但改用RegExp.test()会更直观——它直接返回布尔值,可读性更强。
修正后的代码示例:
const arr = ['a@a.com', 'b@b.com', 'c@c.com']; if (arr !== null && arr.length > 0) { // 方案1:补全return,修正正则 const arr2 = arr.filter(e => { return !e.match(/@b\.com/); }); // 方案2:去掉大括号让箭头函数自动返回结果,用test更清晰 // const arr2 = arr.filter(e => !/@b\.com/.test(e)); console.log(arr2); // 输出 ['a@a.com', 'c@c.com'] }
内容的提问来源于stack exchange,提问作者Sandra Schlichting
相关产品推荐
相关产品推荐

