I am working on a multiplayer game and I have a room array with the following layout (I added comments for better understanding):
Room_Array
[
[
"Room_0", // room name
10, // max people
"Random", // room type
[ // now arrays of players follow
[
1, // ShortID
123, // position X
234, // position Y
10 // angle
],
[
2,
123,
234,
10
],
[
3,
123,
234,
10
],
]
]
// here other rooms are created with the same layout as Room_0 when the max people is reached
]
How would I go around to remove the whole array of the player with ShortID = 2? in case he disconnects?
So the desired result would be:
Room_Array
[
[
"Room_0", // room name
10, // max people
"Random", // room type
[ // now arrays of players follow
[
1, // ShortID
123, // position X
234, // position Y
10 // angle
],
[
3,
123,
234,
10
],
]
]
]
I tried the following code and in the console log it showed me the elements of the array I need to splice, so 2, 123, 234, 10. The commented splice resulted in error unidentified element 1.
for (var i = 0; i < Room_Array.length; i++)
{
if (Room_Array[i][0] === PlayerObject[socket.id].RoomName)
{
for (var j = 0; j < Room_Array[i][3].length; j++)
{
if (Room_Array[i][3][j][0] === PlayerObject[socket.id].ShortID)
{
console.log("Array to splice: " + Room_Array[i][3][j]);
//Room_Array.splice([i][3][j], 1); // error unidentified 1
}
}
break;
}
}
Here is a working solution that mutates the initial array.
const Room_Array = [ [ "Room_0", // room name 10, // max people "Random", // room type [ // now arrays of players follow [ 1, // ShortID 123, // position X 234, // position Y 10 // angle ], [ 2, // ShortID 123, // position X 234, // position Y 10 // angle ], [ 3, 123, 234, 10 ], ] ] ]; function removeUser (array, id) { array.forEach(room => { const [roomName, maxPeople, roomType, players] = room; const index = players.findIndex(([shortId]) => shortId === id); if(index > -1) { players.splice(index, 1); } }); } removeUser(Room_Array, 2); console.log(Room_Array);
Using foreach modifying the existing array
let Room_Array=[["Room_0", 10, "Random",[[ 1,123,234,10],[2,123,234,10],[3,123,234, 10]],]]; function remove(id){ Room_Array.forEach( room => room[3].splice(room[3].findIndex( rm=>rm[0]==id),1)) };remove(2); console.log(Room_Array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Using map returning a new array
let Room_Array=[["Room_0", 10, "Random",[[ 1,123,234,10],[2,123,234,10],[3,123,234, 10]],]]; function remove(id){ return Room_Array.map( room => {room[3].splice(room[3].findIndex( rm=>rm[0]==id),1);return room;}) } console.log(remove(2));
.as-console-wrapper { max-height: 100% !important; top: 0; }
If you want to go down the JSON route instead, which I highly recommend, here's a working example:
const Room_Array = [ { roomName: "Room_0", maxPeope: 10, roomType: "Random", players: [ { shortID: 1, xPosition: 123, yPosition: 234, angle: 10 }, { shortID: 2, xPosition: 123, yPosition: 234, angle: 10 }, { shortID: 3, xPosition: 123, yPosition: 234, angle: 10 }, ] } ]; function removeUser(id) { Room_Array.forEach((room) => { room.players = room.players.filter(player => player.shortID !== id); }); console.log(Room_Array); } removeUser(1);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.