将元素推送到 Javascript 中的嵌套对象 (Socket.io)
Pushing elements to a nested object in Javascript (Socket.io)
我快被这个搞疯了。我是 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]: [] };
但是我之前找不到初始化数组的方法。
感谢您的帮助,
谢谢。
嗨,我想与其像你说的那样重置房间,不如检查它是否在那里?
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 中对象的不必要的指针's/referances。它消耗更多内存,所以我相信你可以删除 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);
};
我快被这个搞疯了。我是 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]: [] };
但是我之前找不到初始化数组的方法。
感谢您的帮助,
谢谢。
嗨,我想与其像你说的那样重置房间,不如检查它是否在那里?
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 中对象的不必要的指针's/referances。它消耗更多内存,所以我相信你可以删除 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);
};