【问题标题】:Data manipulation with a double data set使用双数据集进行数据操作
【发布时间】:2019-10-18 13:10:35
【问题描述】:

返回一个对象,其中每个键是教师姓名,每个值是 他们可以根据自己的技能教授一系列模块。

以下是我应该操作的数据集:

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]
}

【问题讨论】:

  • 对不起 - 这是我得到的结果 ``` { "Pam": [], "Brittany": [], "Nathaniel": [], "Robbie": [], "莱塔”:[],“特拉维斯”:[],“路易莎”:[],“克里斯蒂”:[],“威尔”:[]}```

标签: javascript prototype data-manipulation


【解决方案1】:

首先将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);

【讨论】:

    【解决方案2】:

    自己想出答案后,结果与answer of CertainPerformance基本相同。

    我选择使用Set 作为查找哈希中的值,以便在添加重复项时直接消除它们。我的版本还使用另一种技术来展平阵列。我将concat 数组使用reduce,而不是spreading 数组转换成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);

    【讨论】:

      猜你喜欢
      • 2018-05-04
      • 2023-03-23
      • 1970-01-01
      • 2010-12-30
      • 2019-12-04
      • 2017-04-10
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多