因此,我在询问以下问题的文章(找不到链接或找到解决方案)中发现了一个问题。
给定一些用户数据,按技能对用户进行排序。以下是数据
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)
如您所见,我一直在寻找前进的方向,但似乎无法找到一种可靠的方式来反转数据。解决方案不一定要解决问题,我只是被困住了,无法找到终点线。
您可以减少对象的条目并创建一个新对象。由于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)