wake-up-neo.com

Wie wird eine JavaScript-Hash-Map implementiert?

Zurzeit arbeite ich mit OpenLayers und habe einen riesigen Datensatz, der in eine Vektorebene gezeichnet werden kann (mehr als 100000 Vektoren).

Ich versuche jetzt, all diese Vektoren in eine JavaScript-Hash-Map zu integrieren, um die Leistung zu analysieren. Ich möchte wissen, wie die Hash-Map in JavaScript implementiert ist. Ist es eine echte Hash-Funktion oder nur eine umschlossene Funktion, die eine einfache Datenstruktur und einen Suchalgorithmus verwendet?

69
Patrick H.

jedes Javascript-Objekt ist eine einfache Hashmap, die nur den String-Wert als Schlüssel akzeptiert. Sie können Ihren Code also folgendermaßen schreiben:

var map = {};
// add a item
map[key1] = value1;
// or remove it
delete map[key1];
// or determine whether a key exists
key1 in map;

das Javascript-Objekt ist eine echte Hashmap für seine Implementierung. Daher ist die Komplexität der Suche O (1). Es gibt jedoch keine spezielle hashcode()-Funktion für JavaScript-Zeichenfolgen. Sie wird intern von der Javascript-Engine (V8, SpiderMonkey, JScript.dll usw.) implementiert. ..)

heute unterstützt Javascript jedoch keinen anderen Datentyp außer String als Schlüssel. ECMAv6 (Harmonie) würde eine WeakMap-Klasse einführen, die jedes Objekt als Schlüssel akzeptiert. Dies wäre jedoch eine lange Zeit.

166
otakustay

JavaScript-Objekte können nicht ausschließlich auf Hash-Maps implementiert werden.

Versuchen Sie dies in Ihrer Browserkonsole:

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

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

... und Sie erhalten sie in der Reihenfolge des Einfügens zurück, was de facto Standard Verhalten ist.

Hash-Maps halten an sich keine Reihenfolge, daher können JavaScript-Implementierungen use -hash-Maps irgendwie verwenden, aber wenn dies der Fall ist, sind mindestens ein separater Index und zusätzliche Buchführung für Einfügungen erforderlich.

Hier ist ein Video von Lars Bak, in dem erklärt wird, warum v8 keine Hash-Maps zum Implementieren von Objekten verwendet .

31
Craig Barnes

Hier ist eine einfache und bequeme Möglichkeit, etwas zu verwenden, das der Java Map ähnelt:

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
    }

Und um den Wert zu erhalten:

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

......  etc  .....
19
Miloš

Sollten Sie diese Klasse ausprobieren, 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"

Hinweis: Schlüssel und Wert können einen beliebigen Typ haben.

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

4
Nguyen Tan Dat

Einfache alte JavaScript-Objekte können zwar als Maps verwendet werden, sie sind jedoch in der Regel so implementiert, dass die Reihenfolge der Einfügung aus Kompatibilitätsgründen mit den meisten Browsern erhalten bleibt (siehe Antwort von Craig Barnes) und sind daher keine einfachen Hash-Maps.

ES6 führt richtige Maps (siehe MDN JavaScript Map ) ein, von denen der Standard sagt :

Das Kartenobjekt muss entweder mithilfe von Hashtabellen oder anderen Mechanismen implementiert werden, die im Durchschnitt Zugriffszeiten bereitstellen, die für die Anzahl der Elemente in der Sammlung sublinear sind.

2
mb21
<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>
1
rajendra kumar

Ich bin auf das Problem gestoßen, wo ich den Json mit einigen allgemeinen Schlüsseln hatte. Ich wollte alle Werte gruppieren, die den gleichen Schlüssel haben. Nach etwas Surfen habe ich das hashmap Paket gefunden. Welches ist wirklich hilfreich.

Um das Element mit dem gleichen Schlüssel zu gruppieren, habe ich multi(key:*, value:*, key2:*, value2:*, ...) verwendet.

Dieses Paket ähnelt der Java Hashmap-Sammlung, ist jedoch nicht so leistungsfähig wie Java Hashmap.

0
dd619