首页 > 解决方案 > JS。将嵌套循环替换为标准 Array API

问题描述

我有一个比较两个数组以让用户访问页面的案例:

let permitted = false;
const { authorities } = route.data;
const { roles } = user;
for (const role of roles) {
  for (const authority of authorities) {
    if (role.systemName === authority) {
      permitted = true;
      break;
    }
  }
}

用户有一个数组,roles每个role有字段systemName是一个枚举的值UserType

authorities直接是UserType值数组。

export enum UserType {
  User = 'USER_ROLE',
  Admin = 'ADMIN_ROLE',
}

如何使用JavaScript 之类的some(...)标准数组 API 重构这个嵌套循环?indexOf(...)

标签: javascriptarraysalgorithm

解决方案


虽然您可以使用嵌套的.some( O(n ^ 2)) 来做到这一点,但首先创建一个集合的集合,然后.some在另一个 ( O(n)) 上使用会更有效:

const { authorities } = route.data;
const { roles } = user;
const systemNames = new Set(roles.map(({ systemName }) => systemName));
const permitted = authorities.some(
  authority => systemNames.has(authority)
);

推荐阅读