v1sher47
@v1sher47

Как перебрать массив в массиве и присвоить каждому элементу значения из другого массива?

Всем привет!

Есть участники participants,
const participants = [
    {id: 1, name: 'Anakin Skywalker'},
    {id: 2, name: 'Padmé Amidala'},
    {id: 3, name: 'Luke Skywalker'},
    {id: 4, name: 'Princess Leia'},
]

их нужно расселить по номерам в отеле в любом порядке (без разницы кто с кем).
Отель предоставляет ровно то колличесво мест - сколько участников (5 комнат по одному месту или 2 комнаты по 3 места и тд - не рабочий вариант)

const hotel = [
    {
        room: [
            {id: '', name: ''}
        ]
    },
    {
        room: [
            {id: '', name: ''},
            {id: '', name: ''}
        ]
    },
    {
        room: [
            {id: '', name: ''}
        ]
    }
]


Мое решение
hotel.map(h => {
    h.room.map((r) => {
      r.id = participants[0].id
      r.name = participants[0].name

      participants.shift()

    })
  })


Здесь я перебираю массив hotel и нахожу в нем еще массив room - перебирая его, я присваиваю каждому объекту значения первого участника из массива participants и по завершению установки значений - удаляю его используя метод shift() (аналогичный ему .splice(0, 1))

Когда в room один объект (одно место), то каждый участник находится в своей комнате(отрабатывает на ура), а когда в комнате можно расселить двух участников или больше, происходит перетирание на последнего участника в этой комнате

Результат
const hotel = [
    {
        room: [
            {id: '1', name: 'Anakin Skywalker'}
        ]
    },
    {
        room: [
            {id: '3', name: 'Luke Skywalker'},  // должна быть {id: 2, name: 'Padmé Amidala'},
            {id: '3', name: 'Luke Skywalker'}
        ]
    },
    {
        room: [
            {id: '4', name: 'Princess Leia'}
        ]
    }
]


Так же еще пример результата другого отеля с другими номерами
const hotel = [
    {
        room: [
            {id: '', name: ''},
            {id: '', name: ''}
        ]
    },
    {
        room: [
            {id: '', name: ''},
            {id: '', name: ''}
        ]
    },
]

const hotel = [
    {
        room: [
            {id: 2, name: 'Padmé Amidala'},
            {id: 2, name: 'Padmé Amidala'}
        ]
    },
    {
        room: [
            {id: '4', name: 'Princess Leia'},
            {id: '4', name: 'Princess Leia'}
        ]
    },
]


Помогите пожалуйста понять, что не так я делаю((
  • Вопрос задан
  • 268 просмотров
Решения вопроса 3
Geminix
@Geminix
Фуллстек nuxt, .net разработчик
Добавил return в map (через forEach так же работает)
const participants = [
    {id: 1, name: 'Anakin Skywalker'},
    {id: 2, name: 'Padmé Amidala'},
    {id: 3, name: 'Luke Skywalker'},
    {id: 4, name: 'Princess Leia'},
]

const hotel = [
    {
        room: [
            {id: '', name: ''}
        ]
    },
    {
        room: [
            {id: '', name: ''},
            {id: '', name: ''}
        ]
    },
    {
        room: [
            {id: '', name: ''}
        ]
    }
]

const result = hotel.map(h => {
    return h.room.map((r) => {
      r.id = participants[0].id
      r.name = participants[0].name
      participants.shift()
      return r
    })
  })

console.log(result)

вот результат

[[{"id":1,"name":"Anakin Skywalker"}],
[{"id":2,"name":"Padmé Amidala"},{"id":3,"name":"Luke Skywalker"}],
[{"id":4,"name":"Princess Leia"}]]
Ответ написан
otdameskapizm
@otdameskapizm
Помог ответ? Отметь решением...
Вот эта функция не меняет входные данные, так как она внутри себя создает новые и их возвращает
const checkIntoHotel = (hotel, people) => {
  let index = 0;
  const checkedHotel = hotel.map(({ room }) => room.map(({ id, name }) => {
    const {id: parId, name: parName } = people[index];
    index += 1;
    return { id: parId, name: parName };
  }))
  return checkedHotel;
};
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
Удобно использовать Object.assign() — метод копирует все перечисляемые свойства в целевой объект:
const target = { a: '', b: 'V'}; // скопируем сюда
const source = { a: 'AAA', c: 'CCC' }; // отсюда
Object.assign(target, source);
target // { a: "AAA", b: "V", c: "CCC" }


Если не беда, что опустошатся participants, то можно так:
hotel.forEach(({ room }) => room.forEach(slot => Object.assign(slot, participants.pop())));


Ну или так, с нетронутыми participants.
let i = 0;
hotel.forEach(({ room }) =>
  room.forEach((slot) => Object.assign(slot, participants[i++]))
);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы