@AndrewRusinas

Как сделать фильтрацию массива объектов по динамическому критерию?

Есть достаточно интересный кейс. Есть массив объектов, ниже в коде видно структуру.
Я хочу отфильтровать их по неявному признаку, иначе говоря по такому, которого изначально в этих объектах нет.
К тому же, criteria может содержать разное количество параметров. Ниже псевдокод, могут быть ошибки.

Важный момент, что в моей ситуации нужно отдавать только те, что содержат только искомый скилл.

То есть, если будет
criteria = ['sport']
то функция фильтрации должна вернуть
sport && !music
A именно второй элемент массива (Viktor).

let criteria = ['sport', 'music']

let arr = [
    {
        name: 'Andrew',
        skills: ['guitar', 'running', 'squats']
    },
    {
        name: 'Piotr',
        skills: ['running', 'drums']
    },
    {
        name: 'Viktor',
        skills: ['snowboarding', 'squats']
    }
]

function filterBySkills(people, filter) {
    people.filter(person => {
        let groupedSkills = {
            sport: false,
            music: false
        }

        for (let skill in person.skills) {
            switch (skill) {
                case ('snowboarding'):
                case ('squats'):
                case ('running'):
                    groupedSkills.sport = true
                    break
                case ('guitar'):
                case ('drums'):
                    groupedSkills.music = true
                    break
            }
        }

        // На основании чего сделать return true для функции фильтрации?
    })
}
  • Вопрос задан
  • 89 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const SKILLS = {
  sport: [ 'running', 'squats', 'snowboarding' ],
  music: [ 'guitar', 'drums' ],
};

const filterBySkill = (people, filter) =>
  people.filter(({ skills }) =>
    skills.every(n => filter.some(m => SKILLS[m].includes(n))) &&
    filter.every(n => skills.some(m => SKILLS[n].includes(m)))
  );
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы