JavaScript哈希图如何实现?


88

我目前在OpenLayers上工作,并且有大量数据可以绘制到矢量层中(大于100000个矢量)。

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


2
不仅有一个JS实现,所以没有办法回答。ECMAScript没有指定用于对象的数据结构,也没有指定访问时间的限制。散列是典型的,但可以使用平衡树。
2012年

1
ES6具有纯地图。该链接描述了普通对象和Map之间的区别,关键细节等:MDN JavaScript Map
Den Roman

Answers:


193

每个javascript对象都是一个简单的hashmap,它接受字符串或Symbol作为其键,因此您可以将代码编写为:

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),但没有专用hashcode()的javascript字符串函数,它是由javascript引擎内部实现的(V8,SpiderMonkey,JScript.dll等)。 )

2020更新:

javascript今天也支持其他数据类型:MapWeakMap。它们作为散列图的行为比传统对象更紧密。


完善。我以前使用$('div#someDiv')。data(key,value),这个简单得多,并且可能也对较旧的浏览器提供了更好的支持。谢谢
Swaroop

有没有办法找到地图的长度?
滚石

2
@Sridhar使用Object.keys(map).length
otakustay

1
请注意,您可以使用数字作为键,map[2] = 'foo'但是会在内部将其转换为字符串> map = { '2': 'foo' }
Harry Moreno

@otakustay是我今天才知道的超酷功能:)确实,我需要仔细学习Javascript。
Pankaj Prakash

31

JavaScript对象不能仅在哈希图的顶部实现。

在浏览器控制台中尝试以下操作:

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

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

...您将以插入顺序收到它们,这实际上是标准行为。

哈希图本质上不维护排序,因此JavaScript实现可能会以某种方式使用哈希图,但是如果这样做,它将至少需要一个单独的索引和一些额外的簿记操作。

这是Lars Bak的视频,解释了为什么v8不使用哈希映射实现对象


3
“ otakustay在技术上是错误的,是最严重的错误。” 有点苛刻。它可能不是1:1,但是出于使用像字典一样的哈希的目的和目的,它以相同的方式工作。
可能

1
只是想澄清一下,这对于某些JavaScript实现(例如大多数浏览器)可能是正确的,但不一定总是正确的。ECMAScript标准未定义键上的迭代顺序,可以是任何顺序,并且仍然是有效的JS实现。
TheZ 2015年

19

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

12

您是否应该尝试本课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/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map


4

尽管可以将普通的旧JavaScript对象用作地图,但通常以保留插入顺序的方式实现它们,以与大多数浏览器兼容(请参见Craig Barnes的回答),因此不是简单的哈希图。

ES6引入了适当的Maps(请参阅MDN JavaScript Map),标准中指出

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


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>

0

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

为了使用相同的键将元素分组,我使用了multi(key:*, value:*, key2:*, value2:*, ...)

这个软件包有点类似于Java Hashmap集合,但是没有Java Hashmap强大。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.