Создать карту имен на основе навыков Javascript - PullRequest
0 голосов
/ 30 октября 2019

У меня нулевой опыт использования javascript и я действительно могу использовать некоторую помощь. Как бы то ни было, это также мой первый пост в стеке.

У меня есть следующий список студентов:

var student = [{
    id: 0,
    name: "John",
    skills: ["javascript", "html", "css", "c#"]
  },
  {
    id: 1,
    name: "Brian",
    skills: ["javascript", "java", "c", "c#", "c++", "html"]
  },
  {
    id: 2,
    name: "Michael",
    skills: ["c", "c++", "go", "rust"]
  }
];

Инструкции должны возвращать следующие имена, отсортированные по группам, следующим образом:

  "c": ["Brian", "Michael"],
  "c#": ["John", "Brian"],
  "c++": ["Brian", "Michael"],
  "css": ["John"],
  "go": ["Michael"],
  "html": ["John", "Brian"],
  "java": ["Brian"],
  "javascript": ["John", "Brian"],
  "rust": ["Michael"]
};

Что я пробовалпока что:

function skills(student)
{

      var result = student.reduce(function(map, obj) {
        map[obj.skills] = obj.name;
        return map;
      }, {});
      console.log(result2);
}

skills(student);

Вывод становится ближе к ожидаемому, но я застрял и могу использовать некоторую помощь.

{ 'javascript,html,css,c#': 'John',
  'javascript,java,c,c#,c++,html': 'Brian',
  'c,c++,go,rust': 'Michael' }

Ответы [ 3 ]

1 голос
/ 30 октября 2019

Итерация по каждому из skills в reduce. Проверьте, находится ли навык, который повторяется, первым на карте. Если это не так, установите его значение в пустой массив. Затем введите имя студента:

var student = [{
    id: 0,
    name: "John",
    skills: ["javascript", "html", "css", "c#"]
  },
  {
    id: 1,
    name: "Brian",
    skills: ["javascript", "java", "c", "c#", "c++", "html"]
  },
  {
    id: 2,
    name: "Michael",
    skills: ["c", "c++", "go", "rust"]
  }
];

function skills(student) {
  return student.reduce(function(map, { name, skills }) {
    skills.forEach((skill) => {
      if (!map[skill]) {
        map[skill] = [];
      }
      map[skill].push(name);
    });
    return map;
  }, {});
}

console.log(skills(student));
0 голосов
/ 30 октября 2019

Если вы находитесь в узле & ES2018 +, вы можете использовать https://www.npmjs.com/package/fluent-iterable.

Добавить его в качестве зависимости к файлу package.json:

{
  ..
  "dependencies": {
    ..
    "fluent-iterable": "^0.1.1",
    ..
  },
  ..
}

и выможет иметь следующее решение:

import fluent from 'fluent-iterable';

const student = [..];

console.log(
  fluent(student)
    .flatten(st => st.skills.map(sk => ({ name: st.name, skill: sk }))) // => [ { name, skill }, .. ]
    .group(o => o.skill) // => [ { key: skill, values: [ name, .. ] }, .. ]
    .reduce((current, next) => {
      current[next.key] = fluent(next.values).map(v => v.name).toArray();
      return current;
    }, {})
); // => { skill: [ name, .. ], .. }

Возвращает:

{
  javascript: [ 'John', 'Brian' ],
  html: [ 'John', 'Brian' ],
  css: [ 'John' ],
  'c#': [ 'John', 'Brian' ],
  java: [ 'Brian' ],
  c: [ 'Brian', 'Michael' ],
  'c++': [ 'Brian', 'Michael' ],
  go: [ 'Michael' ],
  rust: [ 'Michael' ]
}

РЕДАКТИРОВАТЬ

Начиная с версии 0.1.2 он поддерживает toObject, что делает это еще проще:

console.log(
  fluent(student)
    .flatten(st => st.skills.map(sk => ({ name: st.name, skill: sk }))) // => [ { name, skill }, .. ]
    .group(o => o.skill) // => [ { key: skill, values: [ name, .. ] }, .. ]
    .toObject( // => { skill: [ name, .. ], .. }
      grp => grp.key,
      grp => fluent(grp.values).map(o => o.name).toArray()
    )
);
0 голосов
/ 30 октября 2019

попробуйте это. и проблема в вашем коде в том, что вы обрабатываете obj.skills, что является неправильным массивом. принятие массива в качестве ключа карты может работать только без исключения, потому что javascript оценивает его как строку.

вам нужно перебрать obj.skills и поместить имя студента в массив вместо переназначения, поэтому я использовалpush метод.

function groupBySkill(list) {
    const regrouped = list.reduce((acc, cur) => {
        cur.skills.forEach((skill) => {
            if (acc[skill] === undefined) {
                acc[skill] = [];
            }

            acc[skill].push(cur.name);
        });

        return acc;
    }, {});

    return regrouped;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...