根据我对文档的理解(here and here)需要一个对内存地址的引用才能工作:
const foo = {};
const map = new Map();
map.set(foo,'123'); // Can only be done if memory address of `foo` is known. Any other shimming would require stringification of foo
这是因为 JavaScript 对象{}
键只能是字符串(至少在 ES5 中)。
但我看到Map
垫片可用:https://github.com/zloirock/core-js#map。我尝试阅读源代码,但它太抽象了(内部 uses 强大的集合,然后导入另外 10 个文件)
Question
请回答以下任一问题
- 有没有一个简单的技巧,它真的可以完成吗(无需字符串化)?
- 也许它会变异
foo
在上面存储一些字符串然后使用它作为密钥?
- 还有其他事情,也许我读错了文档?
我想到了两种方法。首先,显然,您可以拥有一个键数组,并线性搜索它:
Map1 = {
keys: [],
values: [],
};
Map1.set = function(key, val) {
var k = this.keys.indexOf(key);
if(k < 0)
this.keys[k = this.keys.length] = key;
this.values[k] = val;
};
Map1.get = function(key) {
return this.values[this.keys.indexOf(key)];
};
foo = {};
bar = {};
Map1.set(foo, 'xxx');
Map1.set(bar, 'yyy');
document.write(Map1.get(foo) + Map1.get(bar) + "<br>")
第二个选项是向用作键的对象添加特殊的“键”标记:
Map2 = {
uid: 0,
values: {}
};
Map2.set = function(key, val) {
key = typeof key === 'object'
? (key.__uid = key.__uid || ++this.uid)
: String(key);
this.values[key] = val;
};
Map2.get = function(key) {
key = typeof key === 'object'
? key.__uid
: String(key);
return this.values[key];
};
foo = {};
bar = {};
Map2.set(foo, 'xxx');
Map2.set(bar, 'yyy');
document.write(Map2.get(foo) + Map2.get(bar) + "<br>")
与第一个选项不同,第二个选项的复杂度为 O(1)。可以通过以下方式更准确地完成uid
不可写/可枚举。另外,每个Map
应该有自己的“uid”名称(这可以在 Map 构造函数中轻松设置)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)