【发布时间】:2017-07-02 23:22:08
【问题描述】:
我正在使用地图
因为我想存储一个对象作为键。
我的问题是 - 我可以像访问普通对象一样访问地图吗?
例如:
let m = new Map();
let obj = {foo:'bar'};
m[obj] = 'baz';
console.log(m[obj]);
这应该按原样正常工作,还是我需要使用 Map 的 get/set 方法?
我问的原因是,如果我需要使用 get/set,它会迫使我仔细重构大量代码。
这是一个可能需要重构的真实代码示例:
// 之前(broker.wsLock 是普通对象)
function addWsLockKey(broker, ws, key) {
let v;
if (!( v = broker.wsLock[ws])) {
v = broker.wsLock[ws] = [];
}
if (v.indexOf(key) < 0) {
v.push(key);
}
}
//之后(broker.wsLock是一个Map实例)
function addWsLockKey(broker, ws, key) {
let v;
if (!( v = broker.wsLock.get(ws))) {
v = [];
broker.wsLock.set(ws, v);
}
if (v.indexOf(key) < 0) {
v.push(key);
}
}
有没有办法将 v 设置在与 set() 调用相同的行上?
【问题讨论】:
-
一个 Map 就像任何其他 JS 对象一样,所以你可以像你正在做的那样添加属性,但是,你正在做的是添加一个属性
"[object Object]"- 而不是添加一个实际的地图条目。换句话说,你需要使用 set/get -
我刚刚在控制台中尝试了您的示例 - 它似乎工作正常。
-
@Zac,它只是看起来有效,该值实际上并未分配给由实际对象表示的属性,而是设置为 Jaromanda X 提到的名为
[object Object]的属性。 -
使用
m.set(obj, 'baz'); console.log(m.get(obj)); -
是的,我正在寻找一个明确的答案,使用括号表示法真的很方便,让我用一个更好的例子来更新这个问题。
标签: javascript node.js dictionary