2012-01-16 135 views
55

我目前与OpenLayers一起工作,并有一个巨大的数据集绘制成一个矢量图层(大于100000矢量)。JavaScript哈希映射如何实现?

我现在试图将所有这些向量放入一个JavaScript哈希映射来分析性能。我想知道JavaScript中的哈希映射如何实现,它是一个真正的哈希函数还是只是一个使用简单数据结构和搜索算法的包装函数?

+1

有不只是一个JS实现,所以没有办法回答这个问题。 ECMAScript没有指定用于对象的数据结构,也没有指定访问时间的限制。哈希是典型的,但是可以使用平衡的树。 – outis 2012-01-16 09:31:13

回答

136

每个JavaScript对象是一个简单的HashMap只接受字符串值作为其关键,所以你可以写你的代码为:

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的,所以搜索的复杂性是O(1),但没有专门的JavaScript字符串,它是由JavaScript引擎(V8,SpiderMonkey,JScript.dll等内部实现的hashcode()函数)

但是,JavaScript今天不支持其他数据类型除了字符串作为它的键,ECMAv6(和谐)将引入一个WeakMap类来接受一个Ÿ对象作为重点,但是这将是一个很长一段时间......

+0

完美。我之前使用的是$('div#someDiv')。data(key,value),这个更简单,并且可能对更旧的浏览器也有更好的支持。谢谢 – Swaroop 2013-10-15 10:22:24

+0

有没有办法找到地图的长度? – Sridhar 2015-05-25 12:10:26

+2

@Sridhar使用Object.keys(map).length – otakustay 2015-05-26 03:25:22

18

下面是使用类似于Java map东西的简便方式:

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 ..... 
29

JavaScript对象不能纯粹在哈希映射之上实现。

在您的浏览器控制台试试这个:

var foo = { 
    a: true, 
    b: true, 
    z: true, 
    c: true 
} 

for (var i in foo) { 
    console.log(i); 
} 

...你免费获赠它们放回插入顺序,这是de facto standard行为。

哈希映射本身不维护有序,所以JavaScript实现可使用哈希映射不知何故,但如果他们这样做,它会需要至少一个单独的索引和一些额外的簿记的插入。

这是Lars Bak explaining why v8 doesn't use hash maps to implement objects的视频。

+2

“otakustay在技术上是错误的,最糟糕的一种错误。”这有点苛刻。它可能不是1:1,但出于像字典一样使用散列的目的和目的,它以相同的方式工作。 – probablyup 2014-01-27 20:45:28

+0

公平点。我主持了一下。 – 2014-05-14 15:03:00

+1

只是想澄清,这可能是JavaScript的一些实现(如大多数浏览器),但不一定总是如此。迭代键的顺序不是由ECMAScript标准定义的,可以是任何顺序,并且仍然是一个有效的JS实现。 – TheZ 2015-05-19 23:40:21

1
<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> 
3

ES6有纯粹的地图。链接讲述普通物体和地图之间的差异,关键细节等等:

MDN JavaScript Map

1

虽然普通的旧JavaScript对象可以作为地图,他们通常的方式保留插入顺序,可以兼容大多数实施浏览器(见克雷格巴恩斯的答案),因此不是简单的哈希映射。

ES6引入适当的地图(参照MDN JavaScript Map)其中standard says

地图对象都必须用哈希表或其它机制,平均而言,提供作为上的数量次线性访问时间来实现集合中的元素。

0

你应该试试这个类Map

var myMap = new Map(); 
 

 
// setting the values 
 
myMap.set("1", 'value1'); 
 
myMap.set("2", 'value2'); 
 
myMap.set("3", 'value3'); 
 

 
myMap.size; // 3 
 

 
// getting the values 
 
myMap.get("1"); // "value associated with "value1" 
 
myMap.get("2");  // "value associated with "value1" 
 
myMap.get("3");  // "value associated with "value3"

注意:键和值可以是任何类型。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map