Сортировка по массиву объектов по ключам с массива
У меня есть форма. На которой есть услуги. Пользователь выбирает услуги (их может быть от 1 до 20). И с этой формы приходит массив значений ['услуга-1','услуга-2','услуга-3'].
На сайте есть карточки услуг. Для карточек я получаю массив объектов с json.
[{
"name": "газель тент",
"carryingCapacity": "2 тонны",
**"mover": "грузчики",**
"raiseToFloor"; "поднять на этаж"
},
{"name": "газель удлиненная ",
"carryingCapacity": "3 тонны",
}].
Мне нужно перебрать массив объектов на точное вхождение услуг те что пришли массивом с формы. И получить отсортированый массив объектов.
Смисл в чем вот пользователь заходит открывает мою форму. Выберет те услуги что ему нужны. После чего ему выводит карточки только те в которых есть все те услуги.
На данный момент у меня вот такой цыкл
(Object.values(data).map(e =>{
for (let i = 0; i < data.length; i++) {
if(Object.values(e).includes(result[i])){
out[out.length] = e;
}
}
}));
Но он сортирует только по одному вхождению. Например если я отмечу 2 услуги мне выведет 2 карточки В одной карточке будет одна услуга а во второй вторая услуга. Но мне нужно чтоб оно выводило только те карточки в которые предоставляют обе услуги Массив услуг я могу получать как
['грузчики','такелажники'].
или же можно получить
['movers','rigging'].
А эти поля есть ключами объекта
[{
"name": "газель тент",
"carryingCapacity": "2 тонны",
**"mover": "грузчики"**,
"raiseToFloor"; "поднять на этаж" },
{"name": "газель удлиненная ",
"carryingCapacity": "3 тонны",
**"rigging":'такелажники'** }].
Ответы (1 шт):
Если я правильно понял, можно так:
'use strict';
const cards = [
{
a: 1,
b: 2,
c: 3,
},
{
c: 3,
d: 4,
e: 5,
},
];
const options1 = ['b', 'c'];
const options2 = [2, 3];
console.log(filter(cards, options1));
console.log(filter(cards, options2));
function filter(arrayOfCards, arrayOfOptions) {
return arrayOfCards.filter((card) => {
const keys = Object.keys(card);
const values = Object.values(card);
return arrayOfOptions.every(
option => keys.includes(option) || values.includes(option)
);
});
}