如何从也具有非数组元素的数组数组中删除数组元素
How to remove array element from an array of arrays which also has non array elements
我正在开发一款多人游戏,我有一个布局如下的房间阵列(我添加了评论以便更好地理解):
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
]
我该如何移除 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;
}
}
这是一个改变初始数组的可行解决方案。
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);
使用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; }
使用 map 返回一个新数组
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; }
如果你想走 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);
我正在开发一款多人游戏,我有一个布局如下的房间阵列(我添加了评论以便更好地理解):
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
]
我该如何移除 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;
}
}
这是一个改变初始数组的可行解决方案。
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);
使用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; }
使用 map 返回一个新数组
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; }
如果你想走 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);