You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不使用ES6箭头语法时,JS的filter函数是否需return?能否合并两个filter?

嘿,咱们把这两个问题拆开来聊清楚:

1. 不用ES6箭头语法时,filter的回调需要return吗?

必须要!不管你用普通函数还是箭头函数,filter()的核心逻辑是根据回调返回的布尔值过滤数组元素——回调返回true就把当前元素留在新数组里,返回false就剔除。

如果你的普通函数回调没写return,它会默认返回undefined,而undefined在布尔判断里会被当成false,最终filter()会给你返回一个空数组。而且看你的代码,你根本不是要过滤数组,只是想给DOM元素设置属性——这其实是误用了filter()!这种执行“副作用”(修改外部元素)的场景,应该用forEach()才对,它是专门用来遍历数组做这类操作的。

2. 能不能把这两个filter调用合并?

当然可以,而且更推荐的是合并成一次遍历(毕竟两次遍历同一个数组没必要)。

正确的写法(用forEach)

把两个属性设置操作放到同一个forEach回调里就行,代码更简洁也更符合语义:

cars.forEach(function(car, index) {
  car[0].setAttribute("data-original-position", index);
  car[0].setAttribute("data-preferred", "N");
});

如果非要用filter(不推荐)

要是你坚持用filter()(虽然不符合它的设计意图),也可以合并成一个,只要在回调里完成两个属性设置,然后返回一个布尔值(比如return true,这样所有元素都会被保留到新数组里,虽然你大概率不需要这个数组):

cars.filter(function(car, index) {
  car[0].setAttribute("data-original-position", index);
  car[0].setAttribute("data-preferred", "N");
  return true; // 必须返回布尔值,否则filter会返回空数组
});

再啰嗦一句:尽量别用filter()做属性修改这类事,它的本职工作是生成过滤后的新数组,用对工具能让你的代码更易读、更符合规范~

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:29:13