【问题标题】:Match object by array keys - Lodash通过数组键匹配对象 - Lodash
【发布时间】:2021-01-26 01:00:10
【问题描述】:

您好,我有一个对象数组,如下所示:

[
    {
        "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", “节点”, “表示” ] 得到“Peter Coder”而不是“Peter casa”,因为第一个匹配给定数组中的所有技能,是否有任何 lodash 方法来执行此操作?

编辑:

在这个特定的例子中,函数需要让候选人更适合,例如,如果我通过了技能:“技能”:[ “JavaScript”, "es6", “节点” ]即使第一个完美匹配我也需要选择第二个,因为它匹配技能并且有更多技能,所以更好的匹配

【问题讨论】:

  • 有什么理由不使用array.find(value => skills.every(skill => value.skills.includes(skill)))
  • 我只是编辑问题,因为它不完整,您的解决方案适用于第一种情况,但不适用于第二种情况。
  • 对用户使用单个 es6/lodash reduce,并且对于每次迭代,如果他的技能比迭代中的当前用户更适合,则返回累积的用户,否则返回当前用户。最后,您可以直接从 reduce fn 中获得更多匹配的用户

标签: javascript node.js arrays lodash javascript-objects


【解决方案1】:

lodash有一个方法调用intersectionhttps://lodash.com/docs/#intersection

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

【讨论】:

    【解决方案2】:

    使用 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',
        skills: ['javascript', 'es6', 'nodejs', 'express'],
      },
    ]
    
    let skillsByUsers = {}
    const skills = ['javascript', 'es6', 'nodejs', 'express']
    
    users.map(user => {
        const skillValue = _.intersection(user.skills, skills).length
        skillsByUsersTwo = {
            ...skillsByUsersTwo,
            [user.id]: skillValue
        }
    })
    

    没有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
    }
    
    without lodash
    {
      'ae588a6b-4540-5714-bfe2-a5c2a65f547b': 3,
      'ae588a6b-4540-5714-bfe2-a5c2a65f547a': 4
    }
    

    【讨论】:

      猜你喜欢
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      相关资源
      最近更新 更多