gpt4 book ai didi

javascript - 按技能排序对象

转载 作者:行者123 更新时间:2023-12-03 12:59:30 25 4
gpt4 key购买 nike

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

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

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);

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

最佳答案

您可以通过 entries 减少对象并创建一个新对象。由于 value 可以是字符串或数组,您可以使用 [].concat(value) 来获取要循环的技能数组。

添加技能作为累加器的键时,同样的逻辑适用。如果该技能不存在,只需分配acc[skill] = name。如果 key 已经存在,请使用 [].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)

关于javascript - 按技能排序对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58388324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com