Сопоставление объекта по ключам массива — Lodash

#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

вы можете передать массив навыков и пересечь его с умением каждого разработчика. => получить длину этого пересечения в качестве оценки и вернуть значение с наибольшим результатом.