繁体   English   中英

将元素推送到 Javascript (Socket.io) 中的嵌套 object

[英]Pushing elements to a nested object in Javascript (Socket.io)

我对这个越来越疯狂。 我是 Javascript 的新手,我已经在二维 arrays 中使用 PHP 做到了这一点,但我已经没有 JS 的选项了。

我正在尝试开始使用 Socket.io,并且我想创建一个 object(或数组)来处理其上的房间和用户。

例如,我想这样管理它:

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]: [] }; 但我之前找不到初始化数组的方法。

我感谢您的帮助,

谢谢你。

嗨,我想不是像你说的那样重置房间,而是检查它是否在那里?

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 function 更改为此并尝试一下?

编辑:不要在 nodejs 中创建对 object 的不必要的指针/引用。 它消耗更多 memory 所以我相信你可以删除user变量并直接推送它:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM