Как удалить элемент массива из массива массивов, который также имеет элементы, не являющиеся массивами - PullRequest
0 голосов
/ 28 марта 2020

Я работаю над многопользовательской игрой, и у меня есть массив комнат со следующим макетом (я добавил комментарии для лучшего понимания):

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
]

Как бы я go вокруг, чтобы удалить весь массив плеера с ShortID = 2? в случае, если он отключается?

Таким образом, желаемый результат будет:

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
            ],
        ]
    ]
]

Я попробовал следующий код, и в журнале консоли он показал мне элементы массива, которые мне нужно соединить, т. 2, 123, 234, 10. Закомментированное соединение привело к ошибке неопознанного элемента 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;
    }
}

Ответы [ 3 ]

1 голос
/ 28 марта 2020

Вот рабочее решение, которое изменяет исходный массив.

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);
    
0 голосов
/ 28 марта 2020

Если вы хотите go по маршруту JSON вместо этого, что я настоятельно рекомендую, вот рабочий пример:

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);
0 голосов
/ 28 марта 2020

Использование foreach для изменения существующего массива

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

Использование карты, возвращающей новый массив

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; }
...