Размещение элементов во вложенном объекте в Javascript (Socket.io) - PullRequest
0 голосов
/ 20 июня 2020

Я схожу с ума от этого. Я новичок в Javascript, я уже делал это с PHP в двумерных массивах, но у меня заканчиваются варианты с JS.

Я пытаюсь начать работу с Socket.io и я хочу создать объект (или массив) для обработки на нем комнат и пользователей.

Например, я хотел бы управлять им следующим образом:

rooms = {
        roomname: [
            {
                id: id1,
                name: "foo",
            },
            {
                id: id2,
                name: "bar",
            },
        ],
        roomname2: [
            {
                id: id3,
                name: "Juan",
            },
            {
                id: id4,
                name: "Pablo",
            },
        ],
    };

Это часть код и то, что я делал до сих пор.

//Client side is sending: 
socket.emit("join", { name, room, img });
      
//Server side is getting:
const { addUser } = require("./functions.js");
    socket.on("join", ({ name, room, img }, callback) => {
        const { error, user } = addUser({
            id: socket.id,
            name,
            room,
            img: img,
        });
    });

//And addUser function is:
rooms = {};
const addUser = ({ id, name, room, img }) => {
    const user = { id, name, img, room };
    rooms = { ...rooms, [room]: [] };
    rooms[room].push(user);
    
    console.log(rooms)

}

И когда я открываю двух клиентов и пытаюсь войти в две разные комнаты, я получаю что-то вроде этого:

{
  'room123': [
    {
      id: 'PdKPyzXv64Wt2YPlAAAO',
      name: 'jugador76749',
      img: '0',
      room: 'room123',
    }
  ],
  'room999': [
    {
      id: 'PdKPyzXv64Wt2YPlAAAO',
      name: 'jugador4344',
      img: '0',
      room: '999',
    }
  ]
}

НО, если я пытаюсь присоединиться к той же комнате, я получаю только последнего пользователя:

  'room999': [
    {
      id: 'PdKPyzXv64Wt2YPlAAAO',
      name: 'jugador4344',
      img: '0',
      room: '999'
    }
  ]

Я знаю, что сбрасываю массив каждый раз, когда делаю это: rooms = { ...rooms, [room]: [] }; но я не могу найти способ инициализировать массив перед.

Я ценю вашу помощь,

спасибо.

1 Ответ

0 голосов
/ 20 июня 2020

Привет, я думаю, вместо того, чтобы сбрасывать комнату, как вы сказали, просто проверьте, есть ли она?

rooms = {};
const addUser = ({ id, name, room, img }) => {
    const user = { id, name, img, room };
    if (!rooms.hasOwnProperty(room)) {
        rooms[room] = [];
    }
    rooms[room].push(user);
    console.log(rooms);
};

Измените свою функцию addUser на это и попробуйте?

Изменить: не создавать ненужные указатели / ссылки на объект в nodejs. Он потребляет больше памяти, поэтому я считаю, что вы можете просто удалить переменную user и pu sh напрямую:

rooms = {};
const addUser = ({ id, name, room, img }) => {
    // const user = { id, name, img, room };
    if (!rooms.hasOwnProperty(room)) {
        rooms[room] = [];
    }
    rooms[room].push({ id, name, img, room });
    console.log(rooms);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...