我需要确定一组使用 X 数量模块的用户

I need to determine a set of users using X amount of modules

练习分为 A 和 B 两部分。

A很简单,需要查看每个用户使用的模块和return一个对象,格式如下。这部分解决了。

{
 'auth_module': {
    'authn.provider_1': ['./u1.json', './u2.json']
    'authn.provider_2': ['./u3.json', './u4.json', './u5.json']
  },
'content_module': {
    'authz.provider_1': ['./u1.json', './u3.json'],
    'authz.provider_2': ['./u2.json', './u4.json'],
    'authz.provider_3': ['./u5.json']
  }
}

现在,在 B 部分,我需要帮助来解决这个问题:

"Determine a group of users (taken from part A) that together use all the available modules"

示例输出格式如下:

['./u1.json', './u4.json', './u5.json']

我真的不知道如何解决这个问题,所以非常感谢任何形式的帮助。

  • 使用 Object#entries and Array#reduce,在更新目标用户列表时迭代 auth_module
    • 在每次迭代中,解析提供商 ID 并获取该提供商的内容用户列表(如果有的话)
    • 使用Array#forEach,遍历当前授权用户并使用两者之间的共同用户更新目标列表
  • 如果只有 content-only 个提供商,我们还需要将用户推送到列表中。使用 Object#entriesArray#forEach,遍历 content_module
    • 在每次迭代中,检查当前提供者 ID 是否不在 auth_module 中以添加其用户
  • 最后,return 使用 Set
  • 的唯一用户列表

const _getUsers = modules => {
  const authIdPrefix = 'authn.', contentIdPrefix = 'authz.';
  const { 'auth_module': authModule, 'content_module': contentModule } = modules;
  
  const users = Object.entries(authModule)
    .reduce((list, [authProvider, authUsers]) => {
      const providerId = authProvider.substring(authIdPrefix.length);
      const contentUsers = contentModule[`${contentIdPrefix}${providerId}`] ?? [];
      authUsers.forEach(user => {
        if(contentUsers.includes(user)) {
          list.push(user);
        }
      });
      return list;
    }, []);

  Object.entries(contentModule)
    .forEach(([contentProvider, contentUsers]) => {
      const providerId = contentProvider.substring(contentIdPrefix.length);
      if(!authModule[`${authIdPrefix}${providerId}`]) {
        users.push(...contentUsers);
      }
    });

  return [...new Set(users)];
}

const modules = {
  'auth_module': {
    'authn.provider_1': ['./u1.json', './u2.json'],
    'authn.provider_2': ['./u3.json', './u4.json', './u5.json']
  },
  'content_module': {
    'authz.provider_1': ['./u1.json', './u3.json'],
    'authz.provider_2': ['./u2.json', './u4.json'],
    'authz.provider_3': ['./u5.json']
  }
};
console.log( _getUsers(modules) );