JavaScript 哈希映射是如何实现的?

问题描述 投票:0回答:7

我目前使用 OpenLayers 并有大量数据要绘制到矢量图层(超过 100000 个向量)。

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

javascript hash hashmap
7个回答
238
投票

每个 JavaScript object 都是一个简单的哈希映射,它接受字符串或 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),但是 JavaScript 字符串没有专用的

hashcode()
函数,它是由 JavaScript 引擎(V8、SpiderMonkey、JScript.dll)内部实现的等等...)

2020年更新:

JavaScript 如今还支持其他数据类型:

Map
WeakMap
。与传统对象相比,它们的行为更类似于哈希映射。


36
投票

JavaScript 对象不能纯粹在哈希映射之上实现。

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

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

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

...您将按照插入顺序收到它们,这是事实上的标准行为。

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

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


24
投票

你应该尝试这门课吗

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
value
可以是任何类型。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map


20
投票

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

8
投票

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

ES6 引入了适当的映射(参见 MDN JavaScript Map),其中标准表示

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


0
投票

我遇到了一个问题,我有带有一些常用键的 json。我想将具有相同键的所有值分组。经过一番冲浪后,我发现了hashmap包。这真的很有帮助。

为了使用相同的键对元素进行分组,我使用了

multi(key:*, value:*, key2:*, value2:*, ...)

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.