问题描述
[
{
"id": "ae588a6b-4540-5714-bfe2-a5c2a65f547b","name": "Peter casa","skills": [
"javascript","es6","nodejs"
]
},{
"id": "ae588a6b-4540-5714-bfe2-a5c2a65f547a","name": "Peter Coder","nodejs","express"
]
}
]
我正在尝试根据技能获得最佳匹配,我正在使用lodash并且想法是解决:
通过“技能”:[ “ javascript”, “ es6”, “ nodejs”, “表现” ]获得“彼得编码器”而不是“彼得卡萨”,因为第一个匹配给定数组中的所有技能,是否有lodash方法可以执行此操作?
编辑:
在此特定示例中,该功能需要使候选者更合适,例如,如果我通过技能:“技能”:[ “ javascript”, “ es6”, “ nodejs” ],即使它是第一个的完美匹配,我也需要选择第二个,因为它与技能匹配并且具有更多的技能,所以更好的匹配也是
解决方法
有了lodash,您可以按照@Tuan Anh Tran的建议使用intersection
:
const users = [
{
id: 'ae588a6b-4540-5714-bfe2-a5c2a65f547b',name: 'Peter casa',skills: ['javascript','es6','nodejs'],},{
id: 'ae588a6b-4540-5714-bfe2-a5c2a65f547a',name: 'Peter Coder','nodejs','express'],]
let skillsByUsers = {}
const skills = ['javascript','express']
users.map(user => {
const skillValue = _.intersection(user.skills,skills).length
skillsByUsersTwo = {
...skillsByUsersTwo,[user.id]: skillValue
}
})
没有破折号:
let skillsByUsers = {}
const skills = ['javascript','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
}
without lodash
{
'ae588a6b-4540-5714-bfe2-a5c2a65f547b': 3,'ae588a6b-4540-5714-bfe2-a5c2a65f547a': 4
}
,
lodash有一个方法调用@test
https://lodash.com/docs/#intersection
您可以传递技能阵列并将其与每个开发人员的技能相交。 =>获得该交叉点的长度作为得分,并返回得分最高的那个。