Как реализована хэш-карта JavaScript? - PullRequest
75 голосов
/ 16 января 2012

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

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

Ответы [ 7 ]

173 голосов
/ 16 января 2012

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

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

31 голосов
/ 01 сентября 2012

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

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

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

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

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

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

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

19 голосов
/ 10 июля 2012

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

Если вы попробуете этот класс 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"

Примечание: ключ и значение могут быть любого типа.

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

2 голосов
/ 10 октября 2017

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

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

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

1 голос
/ 16 мая 2016
<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>
0 голосов
/ 31 июля 2018

Я столкнулся с проблемой, когда у меня был JSON с некоторыми общими ключами.Я хотел сгруппировать все значения, имеющие один и тот же ключ.После некоторого серфинга я нашел пакет hashmap .Что действительно полезно.

Чтобы сгруппировать элемент с одним и тем же ключом, я использовал multi(key:*, value:*, key2:*, value2:*, ...).

Этот пакет чем-то похож на коллекцию Java Hashmap, но не такой мощный, как Java Hashmap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...