不使用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
相关产品推荐
相关产品推荐

