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

IT技术 javascript hash hashmap
2021-02-03 05:38:59

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

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

6个回答

每个 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 也支持其他数据类型:MapWeakMap. 与传统对象相比,它们更接近于哈希映射。

请注意,您可以使用数字作为键,map[2] = 'foo'但它会在内部转换为字符串> map = { '2': 'foo' }
2021-03-16 05:38:59
有没有办法找到地图的长度?
2021-03-27 05:38:59
@Sridhar 使用 Object.keys(map).length
2021-03-29 05:38:59
@otakustay 这是我今天才知道的非常酷的功能 :) 我真的需要仔细学习 Javascript。
2021-03-31 05:38:59
完美的。我之前使用过 $('div#someDiv').data(key, value) ,这个更简单,并且可能对旧浏览器也有更好的支持。谢谢
2021-04-02 05:38:59

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

在浏览器控制台中试试这个:

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

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

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

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

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

只是想澄清一下,这可能适用于 JavaScript 的某些实现(例如大多数浏览器),但不一定总是如此。键上的迭代顺序不是由 ECMAScript 标准定义的,可以是任何顺序并且仍然是有效的 JS 实现。
2021-03-16 05:38:59
除了某些实现是否使用散列的问题之外,它们是否还保留一个按插入顺序排列的键列表以方便用户,与原始问题并不真正相关。
2021-04-02 05:38:59
“宅男在技术上是错误的,是最糟糕的错误。” 这有点苛刻。它可能不是 1:1,但对于使用像字典一样的哈希的意图和目的,它以相同的方式工作。
2021-04-06 05:38:59

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

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

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

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

ES6 引入了正确的 Maps(参见MDN JavaScript Map),其中标准说

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