2

所以我在一篇提出以下问题的文章中发现了一个问题(找不到链接或者我有解决方案)。

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

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 data = {
  // // Dev : Skills
  mark: ["javascript", "react", "java"],
  rob: "javascript",
  patrick: ["javascript", "react", "python"]
}

function swapNamesAndSkills(object) {
  let data = Object.entries(object); //Was thinking of using the separated entries to compare, but couldn't evaluate correctly.

  //Create a map to store our end key / values
  let skillsToNames = new Map();
  let skills = [].concat(...Object.values(object));
  for (let i = 0; i < skills.length; i++) {
    //if map doesnt have the skill as a key, add skill
    if (!skillsToNames.has(skills[i])) {
      //array of names that have the skill
      skillsToNames.set(skills[i], []);
    }
  }
  console.log(skillsToNames);
}
swapNamesAndSkills(data);

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

4

4 回答 4

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)

您还可以使用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)

于 2019-10-15T06:27:00.920 回答
1

另一个解决方案可能是:

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);
于 2019-10-15T06:40:07.167 回答
1
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())
于 2019-10-15T06:54:55.070 回答
0
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);
于 2019-10-16T09:01:34.290 回答