通过数组键匹配对象-Lodash

问题描述

你好,我有一个看起来像这样的对象数组:

[
    {
        "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

您可以传递技能阵列并将其与每个开发人员的技能相交。 =>获得该交叉点的长度作为得分,并返回得分最高的那个。