我目前與OpenLayers一起工作,並有一個巨大的數據集繪製成一個矢量圖層(大於100000矢量)。JavaScript哈希映射如何實現?
我現在試圖將所有這些向量放入一個JavaScript哈希映射來分析性能。我想知道JavaScript中的哈希映射如何實現,它是一個真正的哈希函數還是隻是一個使用簡單數據結構和搜索算法的包裝函數?
我目前與OpenLayers一起工作,並有一個巨大的數據集繪製成一個矢量圖層(大於100000矢量)。JavaScript哈希映射如何實現?
我現在試圖將所有這些向量放入一個JavaScript哈希映射來分析性能。我想知道JavaScript中的哈希映射如何實現,它是一個真正的哈希函數還是隻是一個使用簡單數據結構和搜索算法的包裝函數?
每個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類來接受一個Ÿ對象作爲重點,但是這將是一個很長一段時間......
下面是使用類似於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 .....
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的視頻。
「otakustay在技術上是錯誤的,最糟糕的一種錯誤。」這有點苛刻。它可能不是1:1,但出於像字典一樣使用散列的目的和目的,它以相同的方式工作。 – probablyup 2014-01-27 20:45:28
公平點。我主持了一下。 – 2014-05-14 15:03:00
只是想澄清,這可能是JavaScript的一些實現(如大多數瀏覽器),但不一定總是如此。迭代鍵的順序不是由ECMAScript標準定義的,可以是任何順序,並且仍然是一個有效的JS實現。 – TheZ 2015-05-19 23:40:21
<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>
ES6有純粹的地圖。鏈接講述普通物體和地圖之間的差異,關鍵細節等等:
雖然普通的舊JavaScript對象可以作爲地圖,他們通常的方式保留插入順序,可以兼容大多數實施瀏覽器(見克雷格巴恩斯的答案),因此不是簡單的哈希映射。
ES6引入適當的地圖(參照MDN JavaScript Map)其中standard says:
地圖對象都必須用哈希表或其它機制,平均而言,提供作爲上的數量次線性訪問時間來實現集合中的元素。
你應該試試這個類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
有不只是一個JS實現,所以沒有辦法回答這個問題。 ECMAScript沒有指定用於對象的數據結構,也沒有指定訪問時間的限制。哈希是典型的,但是可以使用平衡的樹。 – outis 2012-01-16 09:31:13