Каков подход javascript к ассоциативной карте с объектами в качестве ключей (не строк, а уникальных объектов)? - PullRequest
4 голосов
/ 16 декабря 2011

Я ищу путь javascript к ассоциативной карте / массиву / хэшу, который использует объекты в качестве ключей.Замена того, что вы можете сделать в ActionScript 3 с помощью flash.utils.Dictionary.Я уверен, что у java и C # тоже есть что-то похожее.

Это будет работать так же, как и обычный универсальный объектно-ориентированный объект [ключ], но вместо строковых свойств вы используете целые объекты в качестве ключей (это будетсовпадает не с toString (), как Object, а с уникальным экземпляром).Очень удобно для украшения объектов, которыми вы не владеете (используя объект в качестве ключей и ваши украшения в качестве значения).

Псевдокод:

decorations[objectA] = [lights, sparkles, ..];
decorations[objectB] = [skulls, spikes, ..];

if(someObject in decorations) 
    updateDecorations(someObject , decorations[someObject])

Иллюстрация в javascript и почему она не работаетдля объектов:

// make two objects with same toString() return value
var objA = {toString:function(){return 'foo'}};
var objB = {toString:function(){return 'foo'}};

//use objects as keys
var assoc = {};
assoc[objA] = 'dataA';
assoc[objB] = 'dataB';

// seperate instances are not equal
console.log(objA == objB);
// still same data associated: dataB, dataB
console.log(assoc[objA]);   
console.log(assoc[objB]);

//with a Dictionary instead of this would be dataA, dataB

Основная проблема заключается в том, что мне нужно сопоставлять только объекты (они используются каким-то другим процессом, в который вам не нужно вмешиваться, но нам все равно нужна ассоциация).Так что никакой магии .__ хэш-реквизит или toString () перегрузка (если это возможно).

Есть идеи?

edit: я проверил, но это все toString () или добавление магических реквизитов

Ответы [ 2 ]

1 голос
/ 18 декабря 2011

Я недавно написал класс словаря в JS.Это определенно не идеально, так как он использует массив для хранения значений и ключей, но хорошо работает для небольших коллекций.

Вы найдете его здесь: https://github.com/creynders/creynders-js-lib

0 голосов
/ 17 декабря 2011

Я сделал нечто подобное, когда вы связали объект (1 из 19 значков) с картой.Я извлекаю информацию из mysql через PHP и связываю все на карте с их координатами X, Y.

Когда я добавляю mouse_rollover ко всем значкам, я просто циклически перебираю массив и нахожу координаты X, Yи отобразить панель со всеми другими значениями, импортированными в многомерные массивы.

Как вы видите, это помогает?Если это так, я могу предоставить часть своего кода, который я использовал для этого.х

...