我需要确定一组使用 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#entries
和 Array#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) );
练习分为 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
andArray#reduce
,在更新目标用户列表时迭代auth_module
对- 在每次迭代中,解析提供商 ID 并获取该提供商的内容用户列表(如果有的话)
- 使用
Array#forEach
,遍历当前授权用户并使用两者之间的共同用户更新目标列表
- 如果只有 content-only 个提供商,我们还需要将用户推送到列表中。使用
Object#entries
和Array#forEach
,遍历content_module
对- 在每次迭代中,检查当前提供者 ID 是否不在
auth_module
中以添加其用户
- 在每次迭代中,检查当前提供者 ID 是否不在
- 最后,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) );