如何将数组filter中的箭头函数改写为普通函数并解决结果不符问题
问题核心定位
你写的普通函数版本完全没有对齐Array.filter的回调要求,核心有两个逻辑漏洞:
- 单独写了一行
school[0] === "W";的判断表达式,但没有把它和返回值关联——JS中独立的表达式语句不会自动作为函数返回值,这行代码执行完没有任何实际作用 - 最后直接
return school;,返回的是字符串本身,而字符串永远是布尔真值,相当于filter拿到的回调对所有元素都判定为“保留”,完全没有筛选效果,所以根本得不到预期结果
filter的核心运行规则:这个方法接收的回调,最终必须返回真值/假值,用来决定当前元素是否会被加入最终返回的新数组,不是把原元素返回就算完成筛选的。
正确的普通函数改写实现
只要把原来的判断逻辑作为返回值返回即可,和一开始的箭头函数版本效果完全等价:
const schools = ["Yorktown", "Washington & Liberty", "Wakefield"]; const wSchools = schools.filter(function(school) { // 直接返回判断结果,替代原来单独写的判断行 return school[0] === "W"; }); console.log(wSchools); // 实际输出:["Washington & Liberty", "Wakefield"]
容易踩坑的关联细节
- 初始参考代码里的箭头函数
school => school[0] === "W"是箭头函数的简写规则:如果函数体没有写大括号,会自动把后面紧跟的表达式的计算结果作为返回值,这也是为什么原箭头函数可以正常工作——它本质上等价于带大括号、显式写return的普通函数,和最终要写的普通函数结构完全对齐,只是省略了语法糖 - 两种常见的极端错误写法,可以帮你对照理解逻辑差异:
- 像当前测试写法一样,忘记返回判断结果、直接返回原元素:最终会返回所有原数组元素,完全没有筛选效果
- 写了判断逻辑但是漏了
return关键字:函数默认返回undefined(假值),最终会得到一个空数组
内容的提问来源于stack exchange,提问作者Swiss bobo
相关产品推荐
相关产品推荐

