In JavaScript verhalten sich alle Objekte wie hashmaps. Die Schlüssel zu diesen hashmaps müssen jedoch Strings sein. Wenn nicht, werden sie mit toString()
konvertiert. Das heißt:Gibt es eine hashmap-Bibliothek für JavaScript?
var a = {foo: 1};
var b = {bar: 2};
var o = {};
o[a] = 100;
o[b]; // 100
JSON.stringify(o); // '{"[object Object]":100}'
Das heißt, da die toString()
jeder Ebene Objekt ist [object Object]
, sie alle den gleichen Wert adressieren.
Ich möchte eine Hashmap erstellen, wobei Objekte mit denselben Eigenschaften und Werten den gleichen Wert adressieren, Objekte mit unterschiedlichen Eigenschaften oder Werten jedoch unterschiedliche Werte haben. Das heißt:
var a = {foo: 1};
var b = {bar: 2, baz: 3};
var c = {baz: 3, bar: 2};
var hash = new Hash();
hash.set(a, 100);
hash.get(b); // undefined
hash.set(b, 200);
hash.get(b); // 200
hash.get(c); // 200
Mein erster Instinkt war JSON.stringify()
zu verwenden, um Objekte in Strings zu drehen, aber:
var hash = {};
var b = {bar: 2, baz: 3};
var c = {baz: 3, bar: 2};
hash[JSON.stringify(b)] = 100
hash[JSON.stringify(b)] // 100
hash[JSON.stringify(c)] // undefined
JSON.stringify(b) // '{"bar":2,"baz":3}'
JSON.stringify(c) // '{"baz":3,"bar":2}'
Das heißt, JSON Serialisierung ist auftragsabhängig.
Gibt es eine gute Bibliothek oder Technik, um eine Hashmap so zu implementieren?
aktualisieren:
Gleichwertig, gibt es eine gute Hash-Funktion, so dass:
hash({foo: 1, bar: 2}) == hash({bar: 2, foo: 1})
Ja, es braucht etwas Arbeit, um leistungsfähig und kugelsicher zu sein, aber ich denke, du hast die richtige Idee. – Peeja
@Peeja: Ich bin mir nicht sicher, dass es leistungsfähig gemacht werden kann, während es immer noch Ihren Anforderungen entspricht. Obwohl, abhängig von Ihren genauen Bedürfnissen, kann es vielleicht gut genug gemacht werden. – LukeH