如何实现JavaScript哈希映射?

Pat*_*ert 77 javascript hash hashmap

我目前正在使用OpenLayers,并且有大量数据可以绘制到矢量图层(大于100000个矢量).

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

ota*_*tay 179

每个javascript对象都是一个简单的hashmap,只接受字符串值作为其键,因此您可以将代码编写为:

var map = {};
// add a item
map[key1] = value1;
// or remove it
delete map[key1];
// or determine whether a key exists
key1 in map;
Run Code Online (Sandbox Code Playgroud)

javascript对象是其实现的真实hashmap,因此搜索的复杂性为O(1),但hashcode()javascript字符串没有专用函数,它由javascript引擎(V8,SpiderMonkey,JScript.dll等)在内部实现. .)

但是,今天的javascript不支持其他数据类型,除了字符串作为其键,ECMAv6(和谐)会引入一个接受任何对象作为键的WeakMap类,但它会很长时间......

  • @Sridhar使用Object.keys(map).length (2认同)

小智 32

JavaScript对象不能完全在哈希映射之上实现.

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

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

for (var i in foo) {
    console.log(i);
}
Run Code Online (Sandbox Code Playgroud)

......然后你会按照插入顺序收回它们,这是事实上的标准行为.

哈希映射本身不维护排序,因此JavaScript实现可能以某种方式使用哈希映射,但如果它们这样做,它将至少需要一个单独的索引和一些额外的记录来插入.

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

  • "otakustay在技术上是错误的,是最糟糕的错误." 那有点苛刻.它可能不是1:1,但是对于使用类似字典的散列的意图和目的,它以相同的方式工作. (2认同)

Mil*_*loš 19

这是一种使用类似于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
    }
Run Code Online (Sandbox Code Playgroud)

并获得价值:

alert( map['map_name_1'] );    // fives the value of map_value_1

......  etc  .....
Run Code Online (Sandbox Code Playgroud)


Ngu*_*Dat 7

您是否应该尝试本课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"
Run Code Online (Sandbox Code Playgroud)

注意:键和值可以是任何类型。

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map


mb2*_*b21 5

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

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

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