2013-08-26 1 views
0

Я пытаюсь рассматривать объект JS как словарь, и я хочу использовать пару значений (одно буквальное значение, один другой объект) как один ключ , который я делаю в форме массива, без успеха. Проблема заключается в том, что только буквальное значение работает различать ключи, так как следующий фрагмент иллюстрирует:Использование объекта в качестве словаря с массивами в виде ключей в JS

var dictionary = {}; 

var keyOne = { blah:1 }; 
var keyTwo = { blegh:2 }; 

var keyArrayOne = [keyOne, "label"]; 
var keyArrayTwo = [keyTwo, "label"]; 

dictionary[keyArrayOne] = "some data"; 

console.log(dictionary[keyArrayTwo]); //Console returns 'some data' 

Я знаю, что я могу использовать массив вместо моего объекта словаря, а просто перебирать и сравнивать, но надеялся воспользоваться более быстрым поиском.

Для получения дополнительной информации я ничего не знаю об объекте, который составляет первый элемент ключа (это может быть что угодно), но вторая часть всегда является строкой.

Есть ли способ достичь того, что мне нужно?

+1

оба массива являются ["objectObject", "label"]. если вам не нужно безопасно содержать такие ключи, как «valueOf», «__proto__» и т. д., просто используйте объект и Object.keys (obj), чтобы получить массив ключей при необходимости. – dandavis

+0

А, спасибо за ваш ответ. Я с тобой по объектной проблеме; проблема заключается в том, что я использую объект как любую часть ключа, а не массив в частности. Я просто борюсь с предложением Object.keys (obj), я боюсь. Не могли бы вы указать, как это может поместиться вокруг фрагмента, который я опубликовал? Благодарю. – hanenbro

ответ

1

Это может быть полезно:

https://stackoverflow.com/a/10893426/1090464

https://stackoverflow.com/a/10908885/1090464

  • Имейте в виду, JSON.stringify не будет работать для круглых объектов. Также этот метод предполагает, что JSON.stringify возвращает свойства объекта в том же порядке (см. Комментарии в первой ссылке и https://stackoverflow.com/a/17459406/1090464).

  • Другой метод работает, если вы не обеспокоены тем, что вы изменяете объекты, которые передаются; и вы будете выполнять поиск с использованием одного и того же экземпляра объекта, потому что использование другого экземпляра с тем же значением не будет работать. Кроме того, в вашем случае функции GET/пут будет немного по-другому, может быть что-то вроде этого:

    put: function(obj, label, value) { 
        obj.__hash_id = this.nextId(); 
        this.hash[[obj.__hash_id, label]] = value; 
    } 
    
    get: function(obj, label) { 
        return this.hash[[obj.__hash_id, label]]; 
    } 
    
  • Другой подход мог бы использовать метки в качестве ключей, и пусть значение представляет собой массив [ objectPartOfKey, value], с помощью которого вы выполняете поиск линейно (точно так же, как ведро в хеш-таблице). Это может быть быстрее, чем линейный поиск в массиве пар [label, object], если количество объектов на метку «мало» относительно общего количества объектов.

Это, как говорится, может потребоваться сначала измерить удар производительности, прежде чем оптимизировать исходный код, чтобы убедиться, что он того стоит.

+0

Хороший ответ и идеи, спасибо. Есть вероятность, что в какой-то момент все свойства двух ключевых объектов могут быть одинаковыми. И хотя это очень маловероятно, чтобы вызвать конфликт, добавление свойства ключа на ключевые объекты чувствует себя немного грязным: D Комбинация клавиш/массивов звучит как лучший компромисс для скорости и чистоты, поэтому я буду взвесить это до полного -расширенный метод массива, и сравните производительность и производительность. – hanenbro