Как создать массив объектов с определенными свойствами на основе другого массива объектов?

Рейтинг: 0Ответов: 1Опубликовано: 27.01.2023

Есть массив с каютами:

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);