2013-06-23 7 views
5

Voglio creare un hash con elementi DOM come chiavi. Ciò è illustrato dal codice seguente:Utilizzo di un elemento come chiave per un 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' 

Come posso assicurare che le mappe hash per un valore univoco per ogni Element?
Si noti che non è possibile utilizzare la stringa ID come chiave, poiché è possibile passare qualsiasi arbitrario Element, inclusi quelli senza un ID.

+1

perché dovresti 'document.getElementById' quando puoi usare direttamente' id'? –

+1

@KarolyHorvath Spiacente, questo è stato un esempio semplificato, ho bisogno di eliminare l'elemento. –

+0

Si consiglia di controllare [questo thread su matrici univoche] (http://stackoverflow.com/questions/1960473/unique-values-in-an-array) – Stokedout

risposta

6

In JavaScript fino all'ES 6, è possibile utilizzare solo le stringhe come chiave. Se si desidera utilizzare gli elementi DOM, utilizzare due elenchi collegati o l'oggetto WeakMap. Un bonus di quest'ultimo metodo è che non causa perdite di memoria.

applicato al tuo esempio:

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

al momento di scrivere, WeakMap è supportato solo dai seguenti browser:

In tutti gli altri browser, il supporto WeakMap può essere raggiunto attraverso l'accesso al WeakMap.js polyfill.

+3

_ "Poiché la specifica di questa tecnologia non si è stabilizzata, controllare la tabella di compatibilità per l'utilizzo in vari browser.Nota inoltre che la sintassi e il comportamento di una tecnologia sperimentale sono soggetti a modifiche nella versione futura dei browser quando le specifiche cambiano." _ – gdoron

+1

@ gdoron È disponibile un polyfill, ad esempio [Weakmap.js] (https://code.google.com/p/es-lab/source/browse/trunk/src/ses/WeakMap.js), nel caso in cui ti preoccupi compatibilità del browser. –

+0

"Un bonus di quest'ultimo metodo è che non causa perdite di memoria." Direi che in questo caso l'OP dovrebbe usare solo una mappa regolare. –