Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将键组合到由基本体和对象组成的ES6映射_Javascript_Es6 Map - Fatal编程技术网

Javascript 将键组合到由基本体和对象组成的ES6映射

Javascript 将键组合到由基本体和对象组成的ES6映射,javascript,es6-map,Javascript,Es6 Map,ES6映射允许使用具有任何值的键,包括函数、对象和任何基元。我想创建一个包含字符串和DOM节点引用的组合键 var map = new Map(); var myKey = document.body + 'my string' map.set(myKey, 'my value') 显然这不起作用,上面的添加将计算为[object HTMLBodyElement]my string。我该怎么做呢?你不能做你字面上描述的事情,但你可以有一张地图。我可能会使用一个由DOM引用设置键控的值(这样,

ES6映射允许使用具有任何值的键,包括函数、对象和任何基元。我想创建一个包含字符串和DOM节点引用的组合键

var map = new Map();
var myKey = document.body + 'my string'

map.set(myKey, 'my value')

显然这不起作用,上面的添加将计算为
[object HTMLBodyElement]my string
。我该怎么做呢?

你不能做你字面上描述的事情,但你可以有一张地图。我可能会使用一个由DOM引用设置键控的值(这样,如果通过DOM操作删除元素,它就不会强制元素保留在内存中),其中的值是由相关字符串设置键控的。例如:

let entriesByElement = new WeakMap();
设置元素:

let map = entriesByElement.get(document.body);
if (!map) {
    map = new Map();
    entriesByElement.set(document.body, map);
}
map.set(keyString, value);
let map = entriesByElement.get(document.body);
let value = map && map.get(keyString);
获取元素:

let map = entriesByElement.get(document.body);
if (!map) {
    map = new Map();
    entriesByElement.set(document.body, map);
}
map.set(keyString, value);
let map = entriesByElement.get(document.body);
let value = map && map.get(keyString);
(该示例假定您不会将
未定义的
作为有效的存储值。)

你可以在课堂上总结一下

例如:

类示例库{
构造函数(){
this.entriesByElement=new WeakMap();
}
集合(元素、字符串、值){
让map=this.entriesByElement.get(element);
如果(!map){
map=新map();
this.entriesByElement.set(元素,映射);
}
map.set(字符串、值);
}
获取(元素、字符串){
const map=this.entriesByElement.get(元素);
返回map&&map.get(字符串);
}
}
const store=new ExampleStore();
设div1=document.getElementById(“一”);
设div2=document.getElementById(“两个”);
存储集(第1部分,“a”、“ayy”);
存储集(第1部分,“b”、“bee”);
存储集(第2部分,“a”、“alpha”);
console.log(store.get(div1,“a”);//“阿伊”
console.log(store.get(div1,“b”);//“蜜蜂”
console.log(store.get(div2,“a”);//“阿尔法”
console.log(store.get(div2,“b”);//未定义(没有该条目)
//删除div1
文件.正文.删除文件(第1部分);
div1=null;
console.log(store.get(div1,“a”);//如果元素已被删除,则可能未定义
//清洁(这是我用的铬合金,
//Firefox和Edge),因为我们使用
//WeakMap.

使用此自定义的
多键映射
,您可以创建一个映射,该映射根据实例化时传递给
构造函数的数字接受任何数字键。但是,请注意,键的元组是按顺序排列的:

类MultiKeyMap扩展映射{
构造函数(键=1){
如果(键<1){
抛出新的RangeError('键必须大于0')
}
//1键只是一个法线贴图
如果(键===1){
返回新映射()
}
超级()
this.keys=keys
}
获取(键,…键){
if(arguments.length!==this.keys){
抛出新的RangeError('意外的键数')
}
//早归
如果(!super.has(键)){
返回未定义
}
返回super.get(key).get(…key)
}
//(…键,值)是非法签名
设置(键,…参数){
if(args.length!==this.keys){
抛出新的RangeError('意外的键数')
}
如果(!super.has(键)){
super.set(key,新的MultiKeyMap(this.keys-1))
}
返回super.get(key).set(…args)
}
有(钥匙,…钥匙){
if(arguments.length!==this.keys){
抛出新的RangeError('意外的键数')
}
返回super.has(key)和&super.get(key).has(…key)
}
}
常量映射=新的多键映射(2)
map.set(document.body、“我的字符串”、“我的值”)
log(`document.body',my string`)
log(map.has(document.body,'my string'))
log(map.get(document.body,'my string'))
console.log(`mystring',document.body`)
log(map.has('my string',document.body))

console.log(map.get('my string',document.body))
如果我是你,我会给HTML元素一个ID,并使用ID和
你的字符串的串联来获得一个唯一的键@sjahan我想使用ES6映射的功能将对象用作键,并且我必须能够对任何元素执行此操作。@user1506145您也不能将对象与字符串组合。请注意,作为键的对象仍然是通过身份来比较的,而不是通过任何类型的等价物来比较的。