Удаление элемента из многомерного массива или объекта в javascript

#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 /