通过数组键匹配对象 - 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有一个方法调用intersection
https://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的主要内容,如果未能解决你的问题,请参考以下文章
javascript Lodash / Underscore排序对象键。像_.sortBy(),但在键而不是值上,返回一个对象,而不是一个数组。默认为alphan