如何实现JavaScript哈希映射?

时间:2012-01-16 09:03:48

标签: javascript hash hashmap

我目前正在使用OpenLayers,并且有大量数据可以绘制到矢量图层(大于100000个矢量)。

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

7 个答案:

答案 0 :(得分:172)

每个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对象是其实现的真实哈希映射,因此搜索的复杂性为O(1),但javascript字符串没有专用的hashcode()函数,它由javascript引擎内部实现(V8,SpiderMonkey) ,JScript.dll等......)

然而,今天的javascript不支持除字符串之外的其他数据类型,ECMAv6(和谐)会引入一个接受任何对象作为键的WeakMap类,但这将是很长时间......

答案 1 :(得分:31)

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 :(得分:19)

这是一种使用类似于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  .....

答案 3 :(得分:5)

您是否应该尝试此课程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

答案 4 :(得分:2)

虽然普通的旧JavaScript对象可以用作地图,但它们通常以保留插入顺序的方式实现,以便与大多数浏览器兼容(参见Craig Barnes的答案),因此不是简单的哈希映射。 / p>

ES6引入了正确的地图(请参阅MDN JavaScript Map),其中standard says

  

Map对象必须使用哈希表或其他机制来实现,这些机制平均提供对集合中元素数量的次线性访问时间。

答案 5 :(得分: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>

答案 6 :(得分:0)

我遇到了我的json具有一些通用密钥的问题。我想对所有具有相同键的值进行分组。上网冲浪后,我发现了hashmap package。这真的很有帮助。

要使用相同的键对元素进行分组,我使用了multi(key:*, value:*, key2:*, value2:*, ...)

此软件包在某种程度上类似于Java Hashmap集合,但不如Java Hashmap强大。