2 回答

TA贡献1812条经验 获得超5个赞
首先将cohorts数组转换为由课程索引的对象,其值是该课程的关联模块,以便快速查找。也就是说,像这样的对象:
// modulesByCurriculum
{
"html": [ // html is present in module 1 and 3
1,
3
],
"css": [ // css is present in modules 1, 2, and 4
1,
2,
4
], ...
这允许您使用程序名称,例如scope,并快速获取其关联的模块。
然后,遍历讲师并查找每个相关课程以查找模块,通过 Set 进行重复数据删除:
const instructors = [
{ name: 'Pam', module: 2, teaches: ['scope', 'recursion', 'node'] },
{ name: 'Brittany', module: 2, teaches: ['oop', 'pwas'] },
{ name: 'Nathaniel', module: 2, teaches: ['oop', 'scope', 'mobile'] },
{ name: 'Robbie', module: 4, teaches: ['node', 'pwas'] },
{ name: 'Leta', module: 4, teaches: ['pwas', 'node', 'recursion'] },
{ name: 'Travis', module: 1, teaches: ['javascript', 'html', 'css'] },
{ name: 'Louisa', module: 1, teaches: ['javascript', 'html', 'css', 'node', 'pwas'] },
{ name: 'Christie', module: 3, teaches: ['javascript', 'react', 'node'] },
{ name: 'Will', module: 3, teaches: ['javascript', 'redux', 'react', 'oop', 'scope'] }
];
const cohorts = [
{ cohort: 1806, module: 1, studentCount: 30, curriculum: ['html', 'css', 'javascript'] },
{ cohort: 1804, module: 2, studentCount: 21, curriculum: ['javascript', 'css', 'recursion', 'scope', 'oop'] },
{ cohort: 1803, module: 3, studentCount: 20, curriculum: ['react', 'redux', 'html', 'javascript'] },
{ cohort: 1801, module: 4, studentCount: 18, curriculum: ['pwas', 'mobile', 'node', 'javascript', 'css'] }
];
const modulesByCurriculum = cohorts.reduce((a, { module, curriculum }) => {
curriculum.forEach((currName) => {
if (!a[currName]) {
a[currName] = [];
}
a[currName].push(module);
});
return a;
}, {});
const output = instructors.reduce((a, { name, teaches }) => {
a[name] = [...new Set(
teaches.flatMap(currName => modulesByCurriculum[currName])
)];
return a;
}, {});
console.log(output);
如果你不能使用flatMap,你可以concat改为:
const instructors = [
{ name: 'Pam', module: 2, teaches: ['scope', 'recursion', 'node'] },
{ name: 'Brittany', module: 2, teaches: ['oop', 'pwas'] },
{ name: 'Nathaniel', module: 2, teaches: ['oop', 'scope', 'mobile'] },
{ name: 'Robbie', module: 4, teaches: ['node', 'pwas'] },
{ name: 'Leta', module: 4, teaches: ['pwas', 'node', 'recursion'] },
{ name: 'Travis', module: 1, teaches: ['javascript', 'html', 'css'] },
{ name: 'Louisa', module: 1, teaches: ['javascript', 'html', 'css', 'node', 'pwas'] },
{ name: 'Christie', module: 3, teaches: ['javascript', 'react', 'node'] },
{ name: 'Will', module: 3, teaches: ['javascript', 'redux', 'react', 'oop', 'scope'] }
];
const cohorts = [
{ cohort: 1806, module: 1, studentCount: 30, curriculum: ['html', 'css', 'javascript'] },
{ cohort: 1804, module: 2, studentCount: 21, curriculum: ['javascript', 'css', 'recursion', 'scope', 'oop'] },
{ cohort: 1803, module: 3, studentCount: 20, curriculum: ['react', 'redux', 'html', 'javascript'] },
{ cohort: 1801, module: 4, studentCount: 18, curriculum: ['pwas', 'mobile', 'node', 'javascript', 'css'] }
];
const modulesByCurriculum = cohorts.reduce((a, { module, curriculum }) => {
curriculum.forEach((currName) => {
if (!a[currName]) {
a[currName] = [];
}
a[currName].push(module);
});
return a;
}, {});
const output = instructors.reduce((a, { name, teaches }) => {
a[name] = [...new Set(
[].concat(...teaches.map(currName => modulesByCurriculum[currName]))
)];
return a;
}, {});
console.log(output);

TA贡献1866条经验 获得超5个赞
我选择使用Set作为查找哈希中的值,以在添加重复项时直接消除它们。我的版本还使用了另一种技术来展平数组。我concat使用reduce, 而不是将数组扩展到concat调用中。
const instructors = [{name: 'Pam', module: 2, teaches: ['scope', 'recursion', 'node']}, {name: 'Brittany', module: 2, teaches: ['oop', 'pwas']}, {name: 'Nathaniel', module: 2, teaches: ['oop', 'scope', 'mobile']}, {name: 'Robbie', module: 4, teaches: ['node', 'pwas']}, {name: 'Leta', module: 4, teaches: ['pwas', 'node', 'recursion']}, {name: 'Travis', module: 1, teaches: ['javascript', 'html', 'css']}, {name: 'Louisa', module: 1, teaches: ['javascript', 'html', 'css', 'node', 'pwas']}, {name: 'Christie', module: 3, teaches: ['javascript', 'react', 'node']}, {name: 'Will', module: 3, teaches: ['javascript', 'redux', 'react', 'oop', 'scope']}];
const cohorts = [{cohort: 1806, module: 1, studentCount: 30, curriculum: ['html', 'css', 'javascript']}, {cohort: 1804, module: 2, studentCount: 21, curriculum: ['javascript', 'css', 'recursion', 'scope', 'oop']}, {cohort: 1803, module: 3, studentCount: 20, curriculum: ['react', 'redux', 'html', 'javascript']}, {cohort: 1801, module: 4, studentCount: 18, curriculum: ['pwas', 'mobile', 'node', 'javascript', 'css']}];
// prepare module lookup hash
let moduleLookup = {};
cohorts.forEach(({module, curriculum}) => {
curriculum.forEach(craft => {
let modules = moduleLookup[craft] || (moduleLookup[craft] = new Set());
modules.add(module);
});
});
// answer
let result = {};
instructors.forEach(({name, teaches}) => {
let modules = teaches
.map(craft => Array.from(moduleLookup[craft])) // get modules for each craft
.reduce((acc, arr) => acc.concat(arr), []); // flatten 1 level
result[name] = Array.from(new Set(modules)); // remove duplicates
});
console.log(result);
添加回答
举报