我目前使用 OpenLayers 并且有大量数据要绘制到矢量图层中(大于 100000 个矢量)。
我现在正在尝试将所有这些向量放入 JavaScript 哈希映射中以分析性能。我想知道 JavaScript 中的哈希映射是如何实现的,它是一个真正的哈希函数还是只是一个使用简单数据结构和搜索算法的包装函数?
我目前使用 OpenLayers 并且有大量数据要绘制到矢量图层中(大于 100000 个矢量)。
我现在正在尝试将所有这些向量放入 JavaScript 哈希映射中以分析性能。我想知道 JavaScript 中的哈希映射是如何实现的,它是一个真正的哈希函数还是只是一个使用简单数据结构和搜索算法的包装函数?
每个 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对象在其实现上是一个真正的hashmap,所以搜索的复杂度是O(1),但是没有专门hashcode()
的javascript字符串函数,它是由javascript引擎(V8、SpiderMonkey、JScript.dll等)内部实现的。 .)
2020 更新:
JavaScript 对象不能纯粹在哈希映射之上实现。
在浏览器控制台中试试这个:
var foo = {
a: true,
b: true,
z: true,
c: true
}
for (var i in foo) {
console.log(i);
}
...您将按插入顺序收到它们,这是事实上的标准行为。
哈希映射本质上不维护排序,因此 JavaScript 实现可能会以某种方式使用哈希映射,但如果使用,则至少需要一个单独的索引和一些额外的插入簿记。
这是使用类似于 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
}
并获得value:
alert( map['map_name_1'] ); // fives the value of map_value_1
...... etc .....
你应该试试这个类Map
:
var myMap = new Map();
// setting the values
myMap.set("1", 'value1');
myMap.set("2", 'value2');
myMap.set("3", 'value3');
console.log(`Map size: ${myMap.size}`); // 3
// getting the values
console.log(`Key: "1", Value: ${myMap.get("1")}`); // "value associated with "value1"
console.log(`Key: "2", Value: ${myMap.get("2")}`); // "value associated with "value2"
console.log(`Key: "3", Value: ${myMap.get("3")}`); // "value associated with "value3"
注意:key
andvalue
可以是任何类型。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
虽然普通的旧 JavaScript 对象可以用作映射,但它们通常以保留插入顺序以与大多数浏览器兼容的方式实现(参见 Craig Barnes 的回答),因此不是简单的哈希映射。
ES6 引入了正确的 Maps(参见MDN JavaScript Map),其中标准说:
Map 对象必须使用哈希表或其他机制来实现,平均而言,这些机制提供的访问时间与集合中的元素数量呈次线性关系。