#javascript #arrays #object #multidimensional-array
#javascript #массивы #объект #многомерный-массив
Вопрос:
У меня есть объект rooms, внутри этого объекта много массивов rooms, и в каждой комнате есть элемент users.
var rooms = {"room1":["user1","user2"],"room2":["user1","user2","user3"]};
Как мне написать функцию, которая удаляет определенного пользователя из массива rooms при вызове?
function leaveRoom(user,room){
if(typeof room != "undefined"){
//remove user from the specific room ONLY if room argument is passed
} else {
//remove user from all rooms
}
}
Я пытался использовать splice с индексом элемента, но это не работает.
Array.prototype.remove = function(value) {
if (this.indexOf(value)!==-1) {
this.splice(this.indexOf(value), 1);
return true;
} else {
return false;
};
}
var roomName="room1",
userName="user1";
rooms[roomName].remove(userName);
на самом деле я даже не уверен, является ли это объектом или массивом. Пожалуйста, помогите, спасибо
Комментарии:
1. Это приведет к сбою в IE8, но, похоже, он отлично работает в современных браузерах: jsfiddle.net/onypL50r
2. я попытался предупредить (typeof rooms[roomName]); но это объект, так как же выполняется эта функция удаления?
3. Массив — это тип объекта. Ваша функция расширяет класс Array. Когда вы вызывали метод «remove» для комнаты, он распознал его как массив, и функция была доступна для типа массива. Если бы комната не была массивом, вы бы получили сообщение об ошибке.
Ответ №1:
Вы можете использовать for..in
цикл, delete
, Array.prototype.filter()
для удаления элемента, имеющего значение undefined
, из массива
var rooms = {
"room1": ["user1", "user2"],
"room2": ["user1", "user2", "user3"]
};
function leaveRoom(user, room, obj) {
if (room amp;amp; Array.isArray(obj[room])) {
delete obj[room][obj[room].indexOf(user)];
} else {
for (var prop in obj) {
delete obj[prop][obj[prop].indexOf(user)];
}
};
for (var prop in obj) {
obj[prop] = obj[prop].filter(Boolean)
}
}
leaveRoom("user1", "room1", rooms);
console.log(rooms); // remove `"user1"` from `"room1"`
// pass `null` as second parameter to remove `user` from all rooms
leaveRoom("user2", null, rooms); // remove `"user2"` from all rooms
console.log(rooms);
Ответ №2:
Я сделал это с помощью for..in
цикла и slice
. Надеюсь, это поможет вам
var rooms = {
"room1": ["user1", "user2"],
"room2": ["user1", "user2", "user3"],
"room3": ["user1", "user2", "user3"]
};
function leaveRoom(user, room) {
for (var eachroom in rooms) {
if (eachroom == room) {
var users = (rooms[eachroom]);
for (var user_index in users) {
if (users[user_index] == user) {
users.splice(user_index, 1);
break;
}
}
rooms[eachroom] = users;
break;
}
}
//checking whether the user is removed
for (var i in rooms) {
var j = (rooms[i]);
alert(i ":" j);
}
}
leaveRoom('user2', 'room3');
Ссылка на jsfiddle: https://jsfiddle.net/kannanore/s6u6m5fn/3 /