Ich arbeite derzeit mit OpenLayers und habe einen riesigen Datensatz, den ich in eine Vektorebene zeichnen kann (mehr als 100000 Vektoren).
Ich versuche jetzt, alle diese Vektoren in eine JavaScript-Hash-Map einzufügen, 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?
javascript
hash
hashmap
Patrick Hillert
quelle
quelle
Antworten:
Jedes Javascript-Objekt ist eine einfache Hashmap, die nur den Zeichenfolgenwert als Schlüssel akzeptiert. Sie können Ihren Code also wie folgt schreiben:
Das Javascript-Objekt ist eine echte Hashmap für seine Implementierung, daher ist die Komplexität bei der Suche O (1), es gibt jedoch keine dedizierte
hashcode()
Funktion für Javascript-Zeichenfolgen. Es wird intern von der Javascript-Engine (V8, SpiderMonkey, JScript.dll usw.) implementiert. .)Javascript unterstützt heute jedoch keinen anderen Datentyp außer String als Schlüssel. ECMAv6 (Harmony) würde eine WeakMap-Klasse einführen, die jedes Objekt als Schlüssel akzeptiert, aber es würde lange dauern ...
quelle
map[2] = 'foo'
, diese jedoch intern in eine Zeichenfolge umgewandelt wird> map = { '2': 'foo' }
JavaScript-Objekte können nicht nur über Hash-Maps implementiert werden.
Versuchen Sie dies in Ihrer Browserkonsole:
... und Sie erhalten sie in der Einfügereihenfolge zurück, was de facto Standardverhalten ist .
Hash - Karten von Natur aus nicht - Reihenfolge beibehalten, so dass JavaScript - Implementierungen können verwenden Hash - Karten irgendwie, aber wenn sie es tun, wird es zumindest erfordert einen separaten Index und einige zusätzliche Buchhaltung für Einfügungen.
Hier ist ein Video von Lars Bak, in dem erklärt wird, warum v8 keine Hash-Maps zum Implementieren von Objekten verwendet .
quelle
Hier ist eine einfache und bequeme Möglichkeit, etwas Ähnliches wie die Java- Karte zu verwenden :
Und um den Wert zu erhalten:
quelle
Sollten Sie diese Klasse versuchen
Map
:Hinweis: Schlüssel und Wert können beliebig sein.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
quelle
Während einfache alte JavaScript-Objekte als Karten verwendet werden können, werden sie normalerweise so implementiert, dass die Einfügereihenfolge für die Kompatibilität mit den meisten Browsern erhalten bleibt (siehe Antwort von Craig Barnes) und sind daher keine einfachen Hash-Karten.
ES6 führt die richtigen Karten ein (siehe MDN JavaScript Map ), von denen der Standard sagt :
quelle
quelle
Ich hatte das Problem, dass ich den JSON mit einigen gemeinsamen Schlüsseln hatte. Ich wollte alle Werte mit demselben Schlüssel gruppieren. Nach einigem Surfen habe ich ein Hashmap-Paket gefunden . Welches ist wirklich hilfreich.
Um das Element mit demselben Schlüssel zu gruppieren, habe ich verwendet
multi(key:*, value:*, key2:*, value2:*, ...)
.Dieses Paket ähnelt der Java Hashmap-Sammlung, ist jedoch nicht so leistungsfähig wie Java Hashmap.
quelle