Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按数组键匹配对象-Lodash_Javascript_Node.js_Arrays_Lodash_Javascript Objects - Fatal编程技术网

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中找到具有更多匹配项的用户