如何发射Map对象

Fab*_*cio 6 javascript node.js socket.io

在服务器端我有这样的事情:

const users = new Map();
users.set('id', { name: 'name' });
// ...

// then I emit:
io.emit('user_change', users);
Run Code Online (Sandbox Code Playgroud)

在客户端我有类似的东西:

socket.on('user_change', users => {
    for (let user of users) {
        userlist.append(`<li>${user.name}</li>`);
    }
});
Run Code Online (Sandbox Code Playgroud)

但是users是空的({}).

如何发出Map对象?

Ahm*_*sih 9

socket.io(或任何传输机制)可能使用 JSON 作为序列化格式。不幸的是,Maps 和 Sets 以及其他 ES2015 数据类型不能进行 JSON 编码。

let m = new Map([['one', 1], ['ten', 10], ['hundred', 100]]);
console.log(JSON.stringify(m));
// "{}"
Run Code Online (Sandbox Code Playgroud)

这是非常不雅的,但我在服务器端转换为数组数组,传输它,并在客户端重新创建地图:

let transitString = JSON.stringify(Array.from(m));
console.log(transitString)
// "[["one",1],["ten",10],["hundred",100]]"
var newMap = new Map(JSON.parse(transitString));
console.log(newMap)
// Map {"one" => 1, "ten" => 10, "hundred" => 100}
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下,我会io.emit('user_change', Array.from(users));在服务器上做,在客户端上,改变for循环以使用地图:for (let user of (new Map(users)))