如何规避Airbnb ESLint的「箭头函数需返回值」错误?求替代map的方案
解决ESLint箭头函数返回值规则下的数组转字典问题
嘿,这个场景我太熟悉了——用map来做副作用(比如给字典赋值)确实会触发ESLint的array-callback-return规则,毕竟map的本职工作是转换数组并返回新数组,不是用来执行赋值这类副作用的。给你几个更合适的替代方案,完全符合规则:
Array.prototype.forEach()(最推荐的副作用遍历工具)forEach就是专门为遍历数组执行副作用设计的,ESLint不会对它的回调函数提返回值要求,语义也非常清晰:const instances = [/* 你的实例数组 */]; const dict = {}; instances.forEach(instance => { // 直接给字典赋值,无需返回任何内容 dict[instance.id] = instance.data; });别人一看代码就知道你是在遍历做操作,而不是想转换数组,完全规避了规则冲突。
for...of循环(直观的传统写法)
如果你偏爱更直白的循环逻辑,for...of也是绝佳选择,没有任何回调函数返回值的困扰:const instances = [/* 你的实例数组 */]; const dict = {}; for (const instance of instances) { dict[instance.id] = instance.data; }这种写法可读性拉满,要是以后需要中途跳出循环(比如找到某个实例就停止),也比数组方法灵活。
Array.prototype.reduce()(函数式风格的合规方案)
如果你想走纯函数式的路线,reduce可以直接返回构建好的字典,箭头函数明确返回累加器,完美符合ESLint的返回值要求:const instances = [/* 你的实例数组 */]; const dict = instances.reduce((acc, instance) => { acc[instance.id] = instance.data; // 必须返回累加器,满足ESLint规则 return acc; }, {}); // 初始值设为空字典这种写法没有额外的副作用,所有逻辑都在
reduce里完成,既合规又优雅。
总结一下:如果只是单纯的遍历赋值,forEach或for...of最直接;如果偏好函数式编程,reduce是兼顾规则和风格的最佳选择。
内容的提问来源于stack exchange,提问作者Xiaojun Yu
相关产品推荐
相关产品推荐

