2013-06-23 2 views
5

Я хочу создать хэш с элементами DOM в качестве ключей. Это иллюстрируется следующим кодом:Использование элемента в качестве ключа для хеша в 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' 

Как я могу гарантировать, что хэш-карты уникальное значение для каждого Element?
Обратите внимание, что я не могу использовать строку raw ID как ключ, потому что может быть передано любое произвольное Element, в том числе без id.

+1

Зачем вам 'document.getElementById', когда вы можете напрямую использовать' id'? –

+1

@KarolyHorvath Извините, это был упрощенный пример, мне нужно отключить элемент. –

+0

Возможно, вы захотите проверить [эту тему на уникальных массивах] (http://stackoverflow.com/questions/1960473/unique-values-in-an-array) – Stokedout

ответ

6

В JavaScript до ES 6 в качестве ключа могут использоваться только строки. Если вы хотите использовать элементы DOM, используйте либо два связанных списка, либо объект WeakMap. Бонус последнего метода заключается в том, что он не вызывает утечки памяти.

Применительно к вашему примеру:

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

Как письма, WeakMap только поддерживается следующими браузерами:

  • Firefox 6
  • Chrome 19 (по умолчанию отключено, см instructions to enable)
  • Opera 15 (отключено по умолчанию, запустите Opera с --js-flags=--harmony, чтобы включить его).
  • Internet Explorer 11 (confirmed to exist in leaked build)

Во всех других браузерах, поддержка WeakMap может быть достигнуто путем загрузки WeakMap.js polyfill.

+3

_ «Поскольку спецификация этой технологии не стабилизировалась, проверьте таблицу совместимости для использования в различных браузерах. Также обратите внимание, что синтаксис и поведение экспериментальной технологии могут изменяться в будущей версии браузеров по мере изменения спецификации». _ – gdoron

+1

@ gdoron Доступен полиполк, такой как [Weakmap.js] (https://code.google.com/p/es-lab/source/browse/trunk/src/ses/WeakMap.js), если вы беспокоитесь о совместимость браузера. –

+0

«Бонус последнего метода заключается в том, что он не вызывает утечки памяти». Я бы сказал, что в этом случае OP должен просто использовать обычную карту. –