带条件使用JavaScript flatMap筛选拥有有效权限的用户ID
解决方案
核心逻辑是按用户ID聚合权限,筛选出至少有1条isAllowed = true权限记录的用户ID即可。
方案1:基于Lodash实现(适配现有代码)
你项目已经引入了Lodash,用这个方案改动最小,可读性高:
// 按userId分组所有权限记录 const userPermissions = _.groupBy(props.settings.managerPermissions, 'userId') // 过滤出有至少一个有效权限的用户,提取userId const managers = _.keys(_.pickBy(userPermissions, permissionList => { return permissionList.some(item => item.isAllowed) })).map(Number) // 转数字类型,和你原有输出格式保持一致
方案2:原生JS实现(性能更优)
不需要依赖Lodash,单次遍历即可完成统计,数据量大时效率更高:
const validUserFlag = {} // 单次遍历完成用户有效性标记 props.settings.managerPermissions.forEach(item => { // 已经标记为有效的用户无需重复判断 if (validUserFlag[item.userId]) return validUserFlag[item.userId] = item.isAllowed }) // 提取所有有效用户ID,转数字类型 const managers = Object.entries(validUserFlag) .filter(([_, isValid]) => isValid) .map(([userId]) => Number(userId))
两种方案运行后都能得到你期望的输出 [14, 24]。
内容的提问来源于stack exchange,提问作者Zusman
相关产品推荐
相关产品推荐

