Javascript 按技能对对象排序

Javascript 按技能对对象排序,javascript,Javascript,因此,我在一篇文章中发现了一个问题(找不到链接,否则我会找到解决方案),该文章提出了以下问题 给定一些用户数据,按技能对用户进行排序。以下是数据 const namesAndSkills = { // Dev : Skills mark : ["javascript","react","java"], rob : "javascript", patrick : ["javascript", "react", "python"] } Solution(expected

因此,我在一篇文章中发现了一个问题(找不到链接,否则我会找到解决方案),该文章提出了以下问题

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

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
我的解决方案只能将技能与用户分开,但我似乎找不到一种方法将用户与技能进行比较

const数据={
////开发人员:技能
标记:[“javascript”、“react”、“java”],
rob:“javascript”,
帕特里克:[“javascript”、“react”、“python”]
}
函数swapNamesAndSkills(对象){
let data=Object.entries(Object);//正在考虑使用分隔的条目进行比较,但无法正确计算。
//创建一个映射来存储我们的结束键/值
设skillsToNames=newmap();
让skills=[].concat(…Object.values(Object));
for(设i=0;iswapNamesAndSkills(数据)您可以通过减少对象的大小来创建一个新对象。由于
value
既可以是字符串也可以是数组,因此可以使用
[].concat(value)
获得一系列可循环使用的技能

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

const namesAndSkills={
标记:[“javascript”、“react”、“java”],
rob:“javascript”,
帕特里克:[“javascript”、“react”、“python”]
}
const output=Object.entries(namesAndSkills).reduce((acc,[name,value])=>{
[].concat(值).forEach(技能=>{
if(acc[技能])
acc[skill]=[].concat(acc[skill],名称)
其他的
acc[技能]=姓名;
})
返回acc
}, {})

console.log(输出)
另一种解决方案可以是:

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

function swapNamesAndSkills(object) {
    let skillsToNames = new Map();
    for(let i in data) {
        if(data[i] instanceof Array) {
            for(let s of data[i]) {
                if(!skillsToNames.has(s)) {
                    skillsToNames.set(s,[]); 
                }
                skillsToNames.get(s).push(i);
            }
        } else {
            if(!skillsToNames.has(data[i])) {
                skillsToNames.set(data[i],[]); 
            }
            skillsToNames.get(data[i]).push(i);
        }
    }
    console.log(skillsToNames);
}
swapNamesAndSkills(data);

伙计,非常感谢你。我今天在努力解决这个问题,但遇到了一个障碍。非常干净清晰的解决方案,非常感谢!我把所有的技能都看作是一个阵列。并提出了简单的解决方案
function fun(){

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

  var skills = [];

  Object.keys(data).forEach(key=>{
    var skillsList = data[key];
    if(typeof skillsList !=="string"){
    skillsList.forEach(skill=>{
      skills[skill]=[];
      }); 
    }else{
      skills[skillsList] = [];
    }


  });


  Object.keys(data).forEach(key=>{
    var skillsList = data[key];
    if(typeof skillsList !=="string"){
    skillsList.forEach(skill=>{
        if(Object.keys(skills).indexOf(skill)!==-1)
          skills[skill].push(key);
      }); 
    }else{
        if(Object.keys(skills).indexOf(skillsList)!==-1)
          skills[skillsList].push(key); 
    }

  });



  return skills

}

console.log(fun())
const namesAndSkills = {
  mark: ['javascript', 'react', 'java'],
  rob: ['javascript'],
  patrick: ['javascript', 'react', 'python']
};
function solve(namesAndSkills) {
  let skills = [];
  for (const [key, value] of Object.entries(namesAndSkills)) {
    skills.push.apply(skills, value);
  }
  skills = [...new Set(skills)];
  let skillsAndName = {};
  for (const value of skills) {
    skillsAndName[value] = [];
    for (const [name, skill] of Object.entries(namesAndSkills)) {
      if (skill.includes(value)) {
        skillsAndName[value].push(name);
      }
    }
  }
  console.log(skillsAndName);
}
solve(namesAndSkills);