JavaScript函数验证指定Scope与Action存在性问题求助
问题分析与修复方案
你的checked函数逻辑出现问题的核心原因是错误地将Array.find()的结果和~操作符配合使用。
Array.find()返回的是匹配的数组元素(找到时是对象,找不到时是undefined),而不是索引值。~操作符是对数字进行按位取反,当它作用于对象或undefined时,会先将其转换为NaN,再取反还是NaN,最后!!NaN得到false——虽然你的测试用例看起来输出正确,但这只是巧合,实际场景中很容易出现逻辑错误。
下面是几种清晰且正确的修复方案:
方案1:使用Array.some()(最推荐)
some()的语义就是“数组中是否存在至少一个满足条件的元素”,完全匹配你的需求,代码可读性最高:
let userScopes = [ { scope: 'user', actions: ['create', 'read', 'update'], }, ]; function checked(scope, action) { // 参数名改为action,更符合传入单个动作的语义 return userScopes.some(_scope => _scope.scope === scope && _scope.actions.includes(action) ); }
方案2:用findIndex()替代find()
如果你想保留~操作符的写法,可以改用findIndex()(返回匹配元素的索引,找不到返回-1):
let userScopes = [ { scope: 'user', actions: ['create', 'read', 'update'], }, ]; function checked(scope, action) { return !!~userScopes.findIndex(_scope => _scope.scope === scope && _scope.actions.includes(action) ); }
方案3:直接判断find()结果是否存在
直接利用find()返回值的布尔特性,代码简洁明了:
let userScopes = [ { scope: 'user', actions: ['create', 'read', 'update'], }, ]; function checked(scope, action) { return !!userScopes.find(_scope => _scope.scope === scope && _scope.actions.includes(action) ); }
额外建议
- 把参数名
actions改成action,因为你每次传入的是单个动作字符串,避免语义混淆; - 优先用
includes()代替lastIndexOf() !== -1,代码更清晰易懂,语义化更强。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

