为了账号安全,请及时绑定邮箱和手机立即绑定

使用双数据集进行数据操作

使用双数据集进行数据操作

慕盖茨4494581 2021-06-16 18:01:59
返回一个对象,其中每个键是教师姓名,每个值是他们可以根据技能教授的模块的数组。以下是我应该操作的数据集: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'] }];下面是我尝试过的代码,我在遍历两个数据集时一直遇到问题,将它们链接在一起很困难!这是我尝试过但无法让正确的数组显示为对象中的值:let result1 = instructors.reduce((teacherObj, teacherName) => {  if(!teacherObj[teacherName.name]) {    teacherObj[teacherName.name] = []    // console.log(instructors.map(a => a.module))  }  return teacherObj}, {})console.log(result1)预期结果:{   Pam: [2, 4],   Brittany: [2, 4],   Nathaniel: [2, 4],   Robbie: [4],   Leta: [2, 4],   Travis: [1, 2, 3, 4],   Louisa: [1, 2, 3, 4],   Christie: [1, 2, 3, 4],   Will: [1, 2, 3, 4]}
查看完整描述

2 回答

?
慕雪6442864

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);


查看完整回答
反对 回复 2021-06-18
?
心有法竹

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);


查看完整回答
反对 回复 2021-06-18
  • 2 回答
  • 0 关注
  • 163 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信