Задачки с собеседований и не только


Дан список пользователей. У каждого есть массив скилов. Нужно отфильтровать людей имеющих только определенные скилы:

let users = [
{name: 'Alex', experience: ['React', 'Babel']},
{name: 'Boba', experience: ['Ember', 'jQuery']},
{name: 'Lola', experience: ['Angular', 'TS']},
];
// Нужны только люди с такими скилами
let skills = ['Angular', 'React'];

Решение

Нам нужно найти пересечение в 2х массивах. Можем пройтись по списку кандидатов и у каждого кандидата поискать вхождение каждого слова из списка skills. В общем решение предвещает кучу циклов в циклах. Кто-то предложит подключить Lodash и заюзать оттуда функцию intersection. Но все решается проще на чистом ES6+:

let filtered = users.filter(x =>
x.experience.some(i => skills.includes(i))
);
console.log(filtered);

Внутри функции filter мы реализовываем нахождение пересечений 2х массивов через функцию some.

Метод some() проверяет, удовлетворяет ли хоть какой-нибудь элемент массива условию, заданному в передаваемой функции.

https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/some

Т.е. выражение

x.experience.some(i => skills.includes(i))

и есть функци intersection из Underscore

const _ = require('underscore');

let filtered = users.filter(x =>
_.intersection(skills, x.experience)
);
console.log(filtered);

Дисклеймер: яимею в виду что она решает ту же задачу, я не утверждаю что внутри она реализована точно так же.