按技能对对象进行排序

Rob*_*rez 2 javascript

因此,我在询问以下问题的文章(找不到链接或找到解决方案)中发现了一个问题。

给定一些用户数据,按技能对用户进行排序。以下是数据

const namesAndSkills = {
   // Dev : Skills
   mark : ["javascript","react","java"],
   rob : "javascript",
   patrick : ["javascript", "react", "python"]
 } 

Solution(expected output):

  Javascript: ["mark", "rob", "patrick"],
  react: ["mark", "patrick"],
  java: mark,
  python: patrick
Run Code Online (Sandbox Code Playgroud)

我的解决方案只能将技能与用户分开,但是我似乎找不到找到将用户与技能进行比较的方法。

const namesAndSkills = {
   // Dev : Skills
   mark : ["javascript","react","java"],
   rob : "javascript",
   patrick : ["javascript", "react", "python"]
 } 

Solution(expected output):

  Javascript: ["mark", "rob", "patrick"],
  react: ["mark", "patrick"],
  java: mark,
  python: patrick
Run Code Online (Sandbox Code Playgroud)

如您所见,我一直在寻找前进的方向,但似乎无法找到一种可靠的方式来反转数据。解决方案不一定要解决问题,我只是被困住了,无法找到终点线。

adi*_*iga 9

您可以减少对象的条目并创建一个新对象。由于value可以是字符串也可以是数组,因此您可以使用[].concat(value)技巧来循环学习。

向累加器添加技能作为键时,适用相同的逻辑。如果该技能不存在,请分配acc[skill] = name。如果键已经存在,请使用[].concat(acc[skill], name)因为acc[skill]可能是字符串或数组。

const namesAndSkills = {
  mark: ["javascript", "react", "java"],
  rob: "javascript",
  patrick: ["javascript", "react", "python"]
}

const output = Object.entries(namesAndSkills).reduce((acc, [name, value]) => {
  [].concat(value).forEach(skill => {
    if (acc[skill])
      acc[skill] = [].concat(acc[skill], name)
    else
      acc[skill] = name;
  })
  return acc
}, {})

console.log(output)
Run Code Online (Sandbox Code Playgroud)

您还可以使用for...in循环浏览的键namesAndSkills并创建输出

const namesAndSkills = {
  mark: ["javascript", "react", "java"],
  rob: "javascript",
  patrick: ["javascript", "react", "python"]
}

const output = {}

for (const name in namesAndSkills) {
  for (const skill of [].concat(namesAndSkills[name])) {
    if (output[skill])
      output[skill] = [].concat(output[skill], name)
    else
      output[skill] = name;
  }
}

console.log(output)
Run Code Online (Sandbox Code Playgroud)