Javascript 按数组键匹配对象-Lodash
您好,我有一个对象数组,看起来像:Javascript 按数组键匹配对象-Lodash,javascript,node.js,arrays,lodash,javascript-objects,Javascript,Node.js,Arrays,Lodash,Javascript Objects,您好,我有一个对象数组,看起来像: [ { "id": "ae588a6b-4540-5714-bfe2-a5c2a65f547b", "name": "Peter casa", "skills": [ "javascript", "es6",
[
{
"id": "ae588a6b-4540-5714-bfe2-a5c2a65f547b",
"name": "Peter casa",
"skills": [
"javascript",
"es6",
"nodejs"
]
},
{
"id": "ae588a6b-4540-5714-bfe2-a5c2a65f547a",
"name": "Peter Coder",
"skills": [
"javascript",
"es6",
"nodejs",
"express"
]
}
]
我试图根据技能获得最佳匹配,我使用lodash,其理念是解决:
传球技巧:[
javascript,
es6,
nodejs,
表示
]让Peter Coder代替Peter casa,因为第一个匹配给定数组中的所有技能,是否有lodash方法来执行此操作
编辑:
在这个特定的示例中,函数需要让候选人更适合,例如,如果我通过了skills:skills:[
javascript,
es6,
nodejs
]即使它与第一个完美匹配,我也需要选择第二个,因为它与技能匹配,并且有更多的技能,更好的匹配也是如此
您可以传递技能数组,并将其与每个开发人员的技能相交。=>获取该交叉点的长度作为分数,并返回分数最高的交叉点。lodash有一个方法调用交叉点
您可以传递技能数组,并将其与每个开发人员的技能相交。=>获取该交叉口的长度作为分数,并返回分数最高的交叉口。对于lodash,您可以按照@Tuan Anh Tran的建议使用交叉口:
常量用户=[
{
id:'ae588a6b-4540-5714-bfe2-a5c2a65f547b',
名字:“彼得·卡萨”,
技能:['javascript','es6','nodejs'],
},
{
id:'ae588a6b-4540-5714-bfe2-a5c2a65f547a',
姓名:'彼得·科德',
技能:['javascript','es6','nodejs','express'],
},
]
不含lodash:
let skillsByUsers = {}
const skills = ['javascript', 'es6', 'nodejs', 'express']
skills.map(skill => {
users.map(user => {
if (user.skills.includes(skill)) {
const userSkillValue = skillsByUsers[user.id] || 0
skillsByUsers = {
...skillsByUsers,
[user.id]: userSkillValue + 1,
}
}
})
})
它们打印的输出完全相同:
lodash
{
'ae588a6b-4540-5714-bfe2-a5c2a65f547b': 3,
'ae588a6b-4540-5714-bfe2-a5c2a65f547a': 4
}
使用lodash,您可以按照@Tuan Anh Tran的建议使用十字路口:
常量用户=[
{
id:'ae588a6b-4540-5714-bfe2-a5c2a65f547b',
名字:“彼得·卡萨”,
技能:['javascript','es6','nodejs'],
},
{
id:'ae588a6b-4540-5714-bfe2-a5c2a65f547a',
姓名:'彼得·科德',
技能:['javascript','es6','nodejs','express'],
},
]
不含lodash:
let skillsByUsers = {}
const skills = ['javascript', 'es6', 'nodejs', 'express']
skills.map(skill => {
users.map(user => {
if (user.skills.includes(skill)) {
const userSkillValue = skillsByUsers[user.id] || 0
skillsByUsers = {
...skillsByUsers,
[user.id]: userSkillValue + 1,
}
}
})
})
它们打印的输出完全相同:
lodash
{
'ae588a6b-4540-5714-bfe2-a5c2a65f547b': 3,
'ae588a6b-4540-5714-bfe2-a5c2a65f547a': 4
}
有什么理由不直接使用array.findvalue=>skills.everyskill=>value.skills.includeskill吗?我只是编辑了这个问题,因为它不完整,您的解决方案在第一个场景中有效,但在第二个场景中无效。对用户使用单个es6/lodash reduce,对于每一次迭代,如果用户的技能比迭代中的当前技能更适合,则返回累积用户,否则返回当前技能。最后,你直接让用户从reduce fn中找到更多匹配项。为什么不直接使用array.findvalue=>skills.everyskill=>value.skills.includeskill?我只是编辑了这个问题,因为它不完整,你的解决方案在第一个场景中有效,但在第二个场景中无效。对用户使用单个es6/lodash reduce,对于每一次迭代,如果用户的技能比迭代中的当前技能更适合,则返回累积用户,否则返回当前技能。最后,您可以直接从reduce fn中找到具有更多匹配项的用户