我想知道是否可以添加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');
任何人有可能这样的想法吗?
答案 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())