可以在map.set中添加JSON作为键吗?

时间:2018-11-15 20:58:13

标签: javascript

我想知道是否可以添加JSON作为map.set的键值。

将JSON添加为对象可以正常工作:

var theMap = new Map();
var key = {field1 : 'value1', field2: 'value2'};
theMap.set(key, 'foo');

在设置期间添加JSON不起作用:

var theMap = new Map();
theMap.set({field1 : 'value1', field2: 'value2'}, 'bar');

任何人有可能这样的想法吗?

2 个答案:

答案 0 :(得分:2)

首先,您没有使用JSON,而是使用对象引用作为键。对于javascript中的地图数据结构来说,这是完全可以的。 map键和值可以具有任何值,这就是有时选择此数据结构而不是对象(这非常相似,也包含键值对)的原因之一。 。

var theMap = new Map();
var key = {field1 : 'value1', field2: 'value2'};
theMap.set(key, 'foo');

在第二个示例中:

var theMap = new Map();
theMap.set({field1 : 'value1', field2: 'value2'}, 'bar');

您正在通过对象常量即时创建对象。然后,您将使用此创建的对象文字作为值的键(在这种情况下为字符串'bar')。

答案 1 :(得分:1)

将对象用作Map的键时,将通过对象标识来访问该键。换句话说,您需要使用 same 对象而不是具有相同值的对象来查找它。

考虑:

var theMap = new Map();
let obj = {field1 : 'value1', field2: 'value2'}

theMap.set(obj, 'bar');

// you have a reference to obj
// so you can access the value with get
console.log(theMap.get(obj))

// but if you do this
theMap.set({field1 : 'value1', field2: 'value2'}, 'foo');

// you can't get foo with `obj` because having the same keys and values
// doesn't mean they are the same object:

console.log("objects are the same? ", obj === {field1 : 'value1', field2: 'value2'})

// Still setting the value in the map worked.
// You just have two distinct objects as keys 
 
console.log("keys:", ...theMap.keys())