通过数组键匹配对象 - Lodash

Posted

技术标签:

【中文标题】通过数组键匹配对象 - Lodash【英文标题】:Match object by array keys - 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 中获得更多匹配的用户 【参考方案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

【讨论】:

以上是关于通过数组键匹配对象 - Lodash的主要内容,如果未能解决你的问题,请参考以下文章

Lodash合并数组与字典对象键值

javascript Lodash / Underscore排序对象键。像_.sortBy(),但在键而不是值上,返回一个对象,而不是一个数组。默认为alphan

Lodash 合并:仅在源值与目标值匹配时复制对象属性

过滤器会产生一个对象数组,就像使用 lodash 的 operator(%oil%) [重复]

Lodash基于外部数组的排序集合

如何在javascript对象中进行模式匹配