Как реализована хэш-карта JavaScript?

В настоящее время я работаю с OpenLayers и имею огромный набор данных для рисования в векторный слой (более 100000 векторов).

Теперь я пытаюсь поместить все эти векторы в хэш-карту JavaScript для анализа производительности. Я хочу знать, как реализована хэш-карта в JavaScript, является ли она реальной хэш-функцией или просто завернутой функцией, которая использует простую структуру данных и алгоритм поиска?

Ответ 1

каждый объект 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 object - это реальная хэш-карта для его реализации, поэтому сложность поиска - O (1), но для строк javascript нет выделенной функции hashcode(), она внутренне реализована механизмом javascript (V8, SpiderMonkey, JScript.dll и т.д.)

однако, javascript сегодня не поддерживает другой тип данных, кроме строки в качестве своего ключа, ECMAv6 (гармония) будет вводить класс WeakMap, который принимает любой объект как ключ, но это было бы долгое время...

Ответ 2

Объекты JavaScript не могут быть реализованы исключительно поверх хэш-карт.

Попробуйте это в консоли браузера:

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

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

... и вы вернете их обратно в порядке ввода, который фактический стандарт.

Хэш-карты по сути не поддерживают порядок, поэтому реализации JavaScript могут каким-то образом использовать хеш-карты, но если они это сделают, для этого потребуются по крайней мере отдельный индекс и некоторый дополнительный бухгалтерский учет.

Здесь видео Ларс Бак объясняет, почему v8 не использует хеш-карты для реализации объектов.

Ответ 3

Вот простой и удобный способ использования чего-то похожего на 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  .....

Ответ 4

ES6 имеют чистые Карты. Ссылка описывает различия между простым объектом и Map, ключевыми данными и т.д.:

Карта MDN JavaScript

Ответ 5

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

Ответ 6

Хотя обычные старые объекты JavaScript могут использоваться в качестве карт, они обычно реализуются таким образом, чтобы сохранить порядок вставки для совместимости с большинством браузеров (см. ответ Крейга Барнса) и, таким образом, не являются простыми хэш-картами.

ES6 вводит правильные Карты (см. Карта MDN JavaScript), из которых сообщает:

Объект карты должен быть реализован с использованием хэш-таблиц или других механизмов, которые в среднем предоставляют время доступа, которое является сублинейным по количеству элементов в коллекции.