2013-06-23 5 views
5

Ich möchte einen Hash mit DOM-Elementen als Schlüssel erstellen. Dies wird durch den folgenden Code dargestellt:Verwenden eines Elements als Schlüssel für einen Hash in JavaScript

var hash = {}; 
var set = function(element, value) { hash[element] = value; }; 
var get = function(element)  { return hash[element]; }; 

set(document.getElementById('foo'), 'bar'); 
get(document.getElementById('foo')); // returns 'bar' 

Wie kann ich für jeden Element, dass Hash-Karten auf einen eindeutigen Wert gewährleisten?
Beachten Sie, dass ich die rohe ID-Zeichenfolge nicht als Schlüssel verwenden kann, da beliebige Element übergeben werden können, einschließlich denen ohne eine ID.

+1

Warum würden Sie "document.getElementById" verwenden, wenn Sie die ID direkt verwenden können? –

+1

@KarolyHorvath Entschuldigung, dies war ein vereinfachtes Beispiel, ich muss das Element abschalten. –

+0

Vielleicht möchten Sie [diesen Thread auf einzigartigen Arrays] (http://stackoverflow.com/questions/1960473/unique-values-in-an-array) überprüfen – Stokedout

Antwort

6

In JavaScript bis ES 6 können nur Zeichenfolgen als Schlüssel verwendet werden. Wenn Sie DOM-Elemente verwenden möchten, verwenden Sie entweder zwei verknüpfte Listen oder das Objekt WeakMap. Ein Bonus der letzteren Methode ist, dass es keine Speicherlecks verursacht.

zu Ihrem Beispiel Beworben:

var hash = new WeakMap(); 
hash.set(document.getElementById('foo'), 'bar'); 
hash.get(document.getElementById('foo')); // returns 'bar' 

Ab Schreiben wird WeakMap nur durch die folgenden Browser unterstützt:

In allen anderen Browsern, WeakMap Unterstützung kann durch das Laden des WeakMap.js polyfill erreicht werden.

+3

_ "Da sich die Spezifikation dieser Technologie nicht stabilisiert hat, überprüfen Sie die Kompatibilitätstabelle für die Verwendung in verschiedenen Browsern. Beachten Sie auch, dass die Syntax und das Verhalten einer experimentellen Technologie in zukünftigen Browserversionen geändert werden können, wenn sich die Spezifikation ändert." _ – gdoron

+1

@ gdoron Ein Polyfill ist verfügbar, z. B. [Weakmap.js] (https://code.google.com/p/es-lab/source/browse/trunk/src/ses/WeakMap.js), falls Sie sich Sorgen machen sollten Browser-Kompatibilität. –

+0

"Ein Bonus der letzteren Methode ist, dass es keine Speicherlecks verursacht." Ich würde argumentieren, in diesem Fall sollte OP nur eine reguläre Karte verwenden. –