Сортировать массив, показывая сначала общие для другого массива элементы - PullRequest
0 голосов
/ 21 февраля 2020

Я загружаю пользователей с их навыками:

let users: Observable<UserModel[]> this.userService.getOpen().pipe(

  map((payload: Payload<UserResponse[]>) => 

  payload.result.map((response: UserResponse) => { 

    return {
      userId: response.userId, 
      skillsNames: response.skills.map((skill: SkillModel) => skill.name)
    };

  })));

Мне нужно отсортировать skillsNames, показывая сначала те, которые являются общими для проекта.

Чтобы получить навыки a project Я делаю следующее:

let skills: Observable<SkillModel[]> = this.skillService.getByProjectId(id).pipe(

  map((payload: Payload<SkillResponse[]>) => 

    payload.result.map((response: SkillResponse) => { 

      return {
        skillId: response.skillId, 
        name: response.name
      };

    })));

Я также могу выполнить сопоставление между SkillModel пользователя и SkillModel проекта * по skillId, но в конце получаю имена.

Как это сделать?

Обновление

Я добавляю пример, чтобы лучше объяснить, что я ищу:

let users = [
  { 
    userId: 1,
    skills: [
      { Id: 1, name: 'Javascript' },
      { Id: 2, name: 'CSS' }
    ]
  },
  { 
    userId: 2,
    skills: [
      { Id: 1, name: 'Javascript' },
      { Id: 2, name: 'CSS' }
      { Id: 3, name: 'C#' }
    ]
  },
];

let project = { 
    projectId: 1,
    skills: [
      { Id: 2, name: 'CSS' },
      { Id: 3, name: 'C#' }
    ]
  },

Поэтому я хотел бы изменить порядок навыков каждого пользователя, чтобы навыки, которые также присутствуют в навыках проекта, были первыми. Таким образом, пользователи стали бы:

let users = [
  { 
    userId: 1,
    skills: [
      { Id: 2, name: 'CSS' },
      { Id: 1, name: 'Javascript' }
    ]
  },
  { 
    userId: 2,
    skills: [
      { Id: 2, name: 'CSS' }
      { Id: 3, name: 'C#' }
      { Id: 1, name: 'Javascript' }
    ]
  },
];

Посмотрите, как в обоих случаях навыки, которые появляются в проекте, повышаются у каждого пользователя.

1 Ответ

0 голосов
/ 21 февраля 2020

Я не совсем уверен, смогу ли я понять, но я сделал этот пример, который мог бы соответствовать именно тому, что вам нужно:

Этот код просто сортирует всех пользователей по количеству навыков, которые они соответствуют навыкам проекта (массив );

 const users = [
  {
    userId: 1,
    skillsNames: ['JAVA', 'PHP', 'RUBY', 'R']
  },
  {
    userId: 2,
    skillsNames: ['LISP', 'TYPESCRIPT', 'C', 'DOTNET']
  },
  {
    userId: 3,
    skillsNames: ['C#', 'C++', 'VRAPTOR', 'R']
  },
  {
    userId: 4,
    skillsNames: ['LISP', 'RUBY', 'R', 'DOTNET']
  },
];

const skills = ['JAVA', 'PHP', 'RUBY', 'R'];



const userWithSortedSkills = users.map(u => {
   const sortedSkillsName = u.skillsNames.sort(name => {
       return skills.lastIndexOf(name) ? 1 : -1;     
   });

   u.skillsNames = sortedSkillsName;

   return u;
});

console.log(userWithSortedSkills);

...