如何实现JavaScript哈希映射?
我目前使用OpenLayers,并有一个巨大的数据集绘制到vector图层(大于100000vector)。
我现在试图把所有这些向量放入一个JavaScript哈希映射来分析性能。 我想知道在JavaScript中哈希映射是如何实现的,它是一个真正的散列函数还是只是一个使用简单数据结构和searchalgorithm的包装函数?
每个javascript对象都是一个简单的hashmap,它只接受string值作为key,所以你可以写下你的代码:
var map = {}; // add a item map[key1] = value1; // or remove it delete map[key1]; // or determine whether a key exists key1 in map;
JavaScript对象是一个真正的HashMap的实现,所以search的复杂性是O(1),但没有专门的JavaScriptstringhashcode()
函数,它由JavaScript引擎(V8,SpiderMonkey,JScript.dll,等等…)
然而,今天的JavaScript不支持其他数据types,除了string作为它的关键,ECMAv6(和谐)将引入一个WeakMap类接受任何对象作为关键,但它会很长一段时间…
JavaScript对象不能纯粹在哈希映射之上实现。
在浏览器控制台中试试这个:
var foo = { a: true, b: true, z: true, c: true } for (var i in foo) { console.log(i); }
…你会按照插入顺序接收它们,这是事实上的标准行为。
哈希映射本质上并不维护sorting,所以JavaScript实现可能会以某种方式使用哈希映射,但是如果这样做的话,至less需要一个单独的索引和一些额外的logging来进行插入。
这里是Lars Bak的video, 解释了为什么V8不使用散列贴图来实现对象 。
以下是使用类似于Java 地图的简单方便的方法:
var map= { 'map_name_1': map_value_1, 'map_name_2': map_value_2, 'map_name_3': map_value_3, 'map_name_4': map_value_4 }
并获得价值:
alert( map['map_name_1'] ); // fives the value of map_value_1 ...... etc .....
ES6有纯粹的地图。 该链接描述了简单对象和Map之间的区别,关键细节等:
MDN JavaScript地图
<html> <head> <script type="text/javascript"> function test(){ var map= {'m1': 12,'m2': 13,'m3': 14,'m4': 15} alert(map['m3']); } </script> </head> <body> <input type="button" value="click" onclick="test()"/> </body> </html>
虽然简单的旧JavaScript对象可以用作地图,但是通常以保持插入顺序的方式实现,以便与大多数浏览器兼容(请参阅Craig Barnes的答案),因此不是简单的哈希映射。
ES6引入了适当的地图(参见MDN JavaScript Map ),其标准是 :
Map对象必须使用散列表或其他机制来实现,平均而言,这些机制提供的访问时间对于集合中元素的数量是次线性的。