如何实现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对象必须使用散列表或其他机制来实现,平均而言,这些机制提供的访问时间对于集合中元素的数量是次线性的。