我目前在OpenLayers上工作,并且有大量数据可以绘制到矢量层中(大于100000个矢量)。
我现在正尝试将所有这些向量放入JavaScript哈希图中以分析性能。我想知道如何在JavaScript中实现哈希图,它是真正的哈希函数还是只是使用简单数据结构和搜索算法的包装函数?
我目前在OpenLayers上工作,并且有大量数据可以绘制到矢量层中(大于100000个矢量)。
我现在正尝试将所有这些向量放入JavaScript哈希图中以分析性能。我想知道如何在JavaScript中实现哈希图,它是真正的哈希函数还是只是使用简单数据结构和搜索算法的包装函数?
Answers:
每个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更新:
map[2] = 'foo'
但是会在内部将其转换为字符串> map = { '2': 'foo' }
JavaScript对象不能仅在哈希图的顶部实现。
在浏览器控制台中尝试以下操作:
var foo = {
a: true,
b: true,
z: true,
c: true
}
for (var i in foo) {
console.log(i);
}
...您将以插入顺序收到它们,这实际上是标准行为。
哈希图本质上不维护排序,因此JavaScript实现可能会以某种方式使用哈希图,但是如果这样做,它将至少需要一个单独的索引和一些额外的簿记操作。
这是Lars Bak的视频,解释了为什么v8不使用哈希映射实现对象。
您是否应该尝试本课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
尽管可以将普通的旧JavaScript对象用作地图,但通常以保留插入顺序的方式实现它们,以与大多数浏览器兼容(请参见Craig Barnes的回答),因此不是简单的哈希图。
ES6引入了适当的Maps(请参阅MDN JavaScript Map),标准中指出:
必须使用哈希表或其他机制来实现Map对象,这些机制通常平均提供与集合中元素数量成线性关系的访问时间。