#javascript #node.js #arrays #lodash #javascript-objects
#javascript #node.js #массивы #lodash #javascript-объекты
Вопрос:
Привет, у меня есть массив объектов, который выглядит как:
[
{
"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», «express» ] получаем «Peter Coder» вместо «Peter casa», потому что первый соответствует всем навыкам в заданном массиве, есть ли какой-либо метод lodash для выполнения этого?
Редактировать:
В этом конкретном примере функция должна получить кандидата, который лучше подходит, например, если я передаю skills: «skills»: [ «javascript», «es6», «nodejs» ], даже если он идеально подходит для первого, мне нужно выбрать второйпоскольку он соответствует навыкам и обладает большим количеством навыков, поэтому он лучше подходит
Комментарии:
1. Есть какие- нибудь причины , почему бы просто не использовать
array.find(value => skills.every(skill => value.skills.includes(skill)))
?2. Я просто отредактировал вопрос, потому что он был неполным, ваши решения работают в первом сценарии, но не во втором.
3. Используйте одно сокращение es6 / Lodash для пользователей, и для каждой итерации u возвращает накопленного пользователя, если его навыки лучше подходят, чем текущий в итерации, в противном случае текущий. В конце у вас есть непосредственно пользователь с большим количеством совпадений из reduce fn
Ответ №1:
С помощью lodash вы могли бы использовать intersection
, как предложил @Tuan Anh Tran:
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
}
Ответ №2:
в lodash есть вызов метода intersection
https://lodash.com/docs/#intersection
вы можете передать массив навыков и пересечь его с умением каждого разработчика. => получить длину этого пересечения в качестве оценки и вернуть значение с наибольшим результатом.