箭头函数返回赋值触发Lint报错(加括号仍无效)如何解决?
解决箭头函数返回赋值导致的Lint错误,同时实现数组去重筛选
这问题我之前也踩过坑!Lint报错“箭头函数不应返回赋值”,本质是因为你把赋值操作直接作为箭头函数的返回值了——哪怕给赋值加了括号,它依然是个赋值表达式,而这类规则就是为了避免把判断条件(比如==)误写成赋值(=)的笔误,所以会严格禁止这种写法。
咱们先明确你的需求:筛选出members等于3,且id不重复的数组元素。原来的思路是对的(用哈希表/集合记录已出现的id),只是写法不符合Lint规则,下面给你几种靠谱的解决方案:
方案1:拆分逻辑,用明确的布尔值返回(最易读)
把赋值和判断分开,不让箭头函数直接返回赋值,而是先处理逻辑,再返回布尔值:
const auxHash = {}; const filteredHouses = myArray.filter(house => { // 先排除成员数不等于3的元素 if (house.members !== 3) { return false; } // 判断当前id是否已经出现过 const isUnique = !auxHash[house.id]; // 如果是新id,就记录到哈希表里 if (isUnique) { auxHash[house.id] = true; } // 返回是否符合条件的布尔值 return isUnique; });
这种写法逻辑清晰,Lint绝对不会挑错,后续维护也容易看懂。
方案2:用Set替代哈希表(语义更明确)
用ES6的Set来记录已出现的id,代码更简洁,语义也更直观:
const seenIds = new Set(); const filteredHouses = myArray.filter(house => { if (house.members !== 3) return false; if (seenIds.has(house.id)) return false; seenIds.add(house.id); return true; });
Set本身就是用来存储唯一值的,用它来做去重判断比普通对象更贴合场景。
方案3:用逗号表达式(简洁但可读性稍弱)
如果你想保持一行写法,可以用逗号表达式把赋值和返回值分开,让箭头函数最终返回的是布尔值而非赋值操作:
const auxHash = {}; const filteredHouses = myArray.filter(house => house.members === 3 && (!auxHash[house.id] && (auxHash[house.id] = true, true)) );
这里的逗号表达式(auxHash[house.id] = true, true)会先执行赋值,然后返回后面的true,这样箭头函数的返回值就是布尔值,避开了Lint的限制。不过这种写法可读性不如前两种,适合对代码简洁性要求高的场景。
为什么原来的写法不行?
你原来的三元表达式里,auxHash[house.id] = true是赋值操作,它的返回值是true,但Lint规则禁止箭头函数返回赋值表达式——哪怕加了括号,表达式的本质还是赋值,所以依然会触发错误。
内容的提问来源于stack exchange,提问作者Hommer Smith
相关产品推荐
相关产品推荐

