0

I have a rooms object, inside that object has many rooms array, and in each room there are users element.

var rooms = {"room1":["user1","user2"],"room2":["user1","user2","user3"]};

How do I write a function that remove a specific user from the rooms array when called?

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

I have tried to use splice with the index of the element but it doesn't work.

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

actually I'm not even sure if it is an object or array anymore. Please help thanks

3
  • This would fail in IE8, but it seems to work just fine in modern browsers: jsfiddle.net/onypL50r Commented Oct 5, 2016 at 4:11
  • i tried to alert(typeof rooms[roomName]); but it is an object, so how did that remove function runs? Commented Oct 5, 2016 at 4:14
  • An array is a type of object. Your function extends the Array class. When you called the method "remove" on the room, it recognized it as an array and the function was available on the array type. If the room was not an array, you'd have gotten an error. Commented Oct 5, 2016 at 20:23

2 Answers 2

1

You can use for..in loop, delete, Array.prototype.filter() to remove element having value undefined from array

var rooms = {
  "room1": ["user1", "user2"],
  "room2": ["user1", "user2", "user3"]
};

function leaveRoom(user, room, obj) {
  if (room && 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);

Sign up to request clarification or add additional context in comments.

Comments

1

I have made it using for..in loop and slice. Hope this will help you

    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');

Link to jsfiddle: https://jsfiddle.net/kannanore/s6u6m5fn/3/

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.