У меня есть
const rooms = ['roomA', 'roomB', 'roomC']
.const roomOccupants = {
'roomA': [{name: 'player1'}, {name: 'player555'}],
'roomB': [{name: 'player2'}, {name: 'player3'}]
}
Я добавил игроков из roomA
и roomB
в новую комнату, скажем roomABC
, используя функцию карты ниже, однако roomABC
необходимо сгладить, используя метод массива .flat()
, потому что структура возвращаемого значения [{}, {}], [{}, {}]
.
Мне было интересно, есть ли способ, которым я мог бы избежать использования .flat()
, возможно, использование .reduce()
могло бы достичь этого, но я не смог понять это.
const roomABC = rooms.map((roomName) => {
return roomOccupants[roomName];
});
Мне нужно, чтобы вывод был следующим. Нет необходимости в уникальных элементах/порядке элементов в массиве. Заранее спасибо.
const roomABC = [{name: 'player1'}, {name: 'player2'}, {name: 'player3'}, {name: 'player555'}]
const rooms = ['roomA', 'roomB', 'roomC'];
const roomOccupants = {
'roomA': [{name: 'player1'}, {name: 'player555'}],
'roomB': [{name: 'player2'}, {name: 'player3'}]
};
const roomABC = rooms.reduce((acc,curr) => {
if (roomOccupants[curr]){
acc = acc.concat(roomOccupants[curr]);
}
return acc;
},[]);
console.info(roomABC);
/* Prints :
[
{
"name": "player1"
},
{
"name": "player555"
},
{
"name": "player2"
},
{
"name": "player3"
}
]
*/
Здесь acc — накопленный результат, а curr — текущее значение.
Функция редуктора вызывается для каждого элемента массива комнат. Таким образом, в приведенном выше фрагменте кода curr будет принимать значения «room1», «room2» и «room3».
Мы начинаем с пустого списка, [] в качестве начального значения согл.
Функция проверяет, существует ли roomOccupants[curr], и если да, то объединяет его значение с предыдущим значением acc.
Надеюсь это поможет!
Хорошо написано и объяснено! +1 В синтаксисе ES6 вы даже можете написать это в одну строку: const roomABC = rooms.reduce((a,c) => [...a,...roomOccupants[c]??[]],[])
.
есть ли быстрый способ включить в выходной массив только уникальных игроков? @КарстенМассманн
Ниже будет код для неповторяющихся игроков:
const rooms = ['roomA', 'roomB', 'roomC'];
const roomOccupants = {
'roomA': [{name: 'player1'}, {name: 'player555'}],
'roomB': [{name: 'player1'}, {name: 'player3'}],
'roomD': [{name: 'harry'}]
};
const roomABC = Object.values(rooms.reduce((a,r,os) =>{
if (os=roomOccupants[r])
os.forEach(o=>a[o.name]=o);
return a;
},{}))
console.info(roomABC);
Почему вы хотите избежать
flat
?