【问题标题】:Pushing elements to a nested object in Javascript (Socket.io)将元素推送到 Javascript (Socket.io) 中的嵌套对象
【发布时间】:2020-06-20 15:14:27
【问题描述】:

我对这个越来越疯狂了。我是 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]: [] }; 但我之前找不到初始化数组的方法。

感谢您的帮助,

谢谢。

【问题讨论】:

    标签: javascript arrays object socket.io push


    【解决方案1】:

    您好,我认为与其像您说的那样重置房间,只需检查它是否在那里?

    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 变量并直接推送它:

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

    【讨论】:

    • 我觉得自己太笨了,它就像一个魅力。非常感谢!!!
    • 不用了,在 js 中有很多方法可以做某事 =)
    猜你喜欢
    • 2020-06-21
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2021-10-28
    • 2021-11-06
    • 2018-05-10
    相关资源
    最近更新 更多