JavaScript 散列映射是如何实现的?

我目前使用 OpenLayers,并且有大量的数据要绘制到矢量层(大于100000个矢量)。

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

301482 次浏览

每个 javascript 对象都是一个简单的散列表,它接受一个字符串或者一个 符号作为它的键,所以你可以这样写你的代码:

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 等)在内部实现的。.)

2020 Update:

Javascript 现在也支持其他数据类型: MapWeakMap。它们比传统对象更接近于散列映射。

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

JavaScript objects cannot be implemented purely on top of hash maps.

在浏览器控制台中尝试这样做:

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


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

然后按插入顺序收回,这是 行业标准行为。

散列映射本身不维护顺序,因此 JavaScript 实现可能会以某种方式使用 使用散列映射,但如果使用了,那么插入操作至少需要一个单独的索引和一些额外的簿记。

Here's a video of Lars Bak explaining why v8 doesn't use hash maps to implement objects.

function test() {
var map = {
'm1': 12,
'm2': 13,
'm3': 14,
'm4': 15
}
alert(map['m3']);
}
<input type="button" value="click" onclick="test()" />

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

ES6引入正确的地图(见 MDN JavaScript 地图) ,其中 标准规定:

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

你是否应该试试这门课 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"

注意: keyvalue可以是任何类型。

Https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/map

I was running into the problem where i had the json with some common keys. I wanted to group all the values having the same key. After some surfing I found 散列表包. Which is really helpful.

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

This package is somewhat similar to Java Hashmap collection, but not as powerful as Java Hashmap.