Как создать массив объектов с определенными свойствами на основе другого массива объектов?
Есть массив с каютами:
const cabins = [{
adult: 1, // выбран 1 взрослый
teenager: 1, // выбран 1 подросток
babe: 1 // выбран 1 ребенок
},
{
adult: 2, // выбрано 2 взрослых
teenager: 0,
babe: 1 // выбран 1 ребенок
}
]
В котором было выбрано условно 2 каюты с пассажирами, при создании данного массива так же должен отдельно создаться еще один массив passengers = [] в котором будут присутствовать объекты (1 пассажир === 1 объект) с свойством WithSeat: 1 или WithSeat: 0 в зависимости от информации с backend который я получаю ниже:
const obj = {
result: "1",
types: [{
ID: 1,
Text: "Взрослый",
WithSeat: 1 //с местом
},
{
ID: 2,
Text: "Подросток",
WithSeat: 1 //с местом
},
{
ID: 3,
Text: "Ребенок",
WithSeat: 0 //без места
}
]
}
Вытаскиваю нужные мне WithSeat из массива бэкенда и создаю объект-определитель "с местом/без места" для дальнейшей работы:
const withSeat = {
adult: 1,
teenager: 1,
babe: 0,
};
В конечном итоге я должен получить вот такую структуру массива объектов пассажиров:
const passengers = [{
WithSeat: 1, // adult
},
{
WithSeat: 1, // teenager
},
{
WithSeat: 0, // babe
},
{
WithSeat: 1, // adult
},
{
WithSeat: 1, // adult
},
{
WithSeat: 0, // babe
},
]
По принципу работы это счетчик, в котором выбирается количество пассажиров и формируется массив cabins, приблизительный наглядный пример: https://jsfiddle.net/xfh2csby/1/
Ответы (1 шт):
Каждом элементу из массива cabins соответствует несколько элементов, по количеству полей. При этом каждом из полей может соответствовать несколько элементов по значению поля.
Для такого отображения удобно воспользоваться методами .map и .flatMap
const cabins = [{
adult: 1, // выбран 1 взрослый
teenager: 1, // выбран 1 подросток
babe: 1 // выбран 1 ребенок
},
{
adult: 2, // выбрано 2 взрослых
teenager: 0,
babe: 1 // выбран 1 ребенок
}
];
const withSeat = {
adult: 1,
teenager: 1,
babe: 0,
};
const result = cabins.flatMap(c =>
Object.entries(c).flatMap(([kind, length]) =>
Array.from({length}, () => ({
WithSeat: withSeat[kind]
}))));
console.log(result);