Мне нужно хранить некоторую статистику с использованием JavaScript таким образом, как я сделал бы это в C #:
Dictionary<string, int> statistics;
statistics["Foo"] = 10;
statistics["Goo"] = statistics["Goo"] + 1;
statistics.Add("Zoo", 1);
Есть Hashtable
или что-то вроде Dictionary<TKey, TValue>
в JavaScript?
Как я могу хранить значения таким образом?
javascript
dictionary
hashtable
George2
источник
источник
Ответы:
Используйте объекты JavaScript в качестве ассоциативных массивов .
Создать объект с
Альтернативный синтаксис для того же:
Если вы также можете создать ключ к значению карты объектов со следующим синтаксисом
источник
new Array()
хмурится. В конце концов, статья упоминает о своих недостатках и предлагаетnew Object()
или в{}
качестве предпочтительных альтернатив, но это близко к концу, и я боюсь, что большинство читателей не доберутся до этого.var obj1 = {}; var obj2 = {}; var table= {}; table[obj1] = "A"; table[obj2] = "B"; alert(table[obj1]); //displays B
потому что он не может различить ключи obj1 и obj2; они оба преобразуются в строку и просто становятся чем-то вроде «объекта». Полный сбой и делает безопасную типизированную сериализацию со ссылками и нетронутыми циклическими ссылками трудными или неэффективными в JavaScript. Это легко во Flash / AS3.Point.prototype.equals = function(obj) { return (obj instanceof Point) && (obj.x === this.x) && (obj.y === this.y); };
for... in
словарь будет зацикливаться на его ключах, поэтому,Object.keys
кажется, там неуместен.Object.keys
возвращает массив ключей словаря, иfor... in
для массива циклы над его «ключами», которые для массива являются его индексами, а не его значениями.Если вы пришли из объектно-ориентированного языка, вы должны проверить эту статью .
источник
Все современные браузеры поддерживают JavaScript- объект Map . Есть несколько причин, по которым использование карты лучше, чем Object:
Пример:
Если вы хотите, чтобы ключи, на которые нет ссылок из других объектов, собирались мусором, рассмотрите возможность использования WeakMap вместо Map.
источник
Map
вряд ли полезно, когда ваш ключ является объектом, но его следует сравнивать по значению, а не по ссылке.Если у вас нет конкретной причины не делать этого, просто используйте обычный объект. На свойства объекта в Javascript можно ссылаться с использованием синтаксиса в стиле хеш-таблицы:
Оба
foo
иbar
элементы теперь могут затем ссылаться как:Конечно, это означает, что ваши ключи должны быть строками. Если они не являются строками, они конвертируются внутренне в строки, так что это все равно может работать, YMMV.
источник
var hash = {}; hash[1] = "foo"; alert(hash["1"]);
оповещения "foo".var dict = {}; dict.key1 = "val1"; dict["key2"] = "val2";
на элемент ключа dic1 dict могут ссылаться эквивалентно какdict["key1"]
и, так иdict.key1
.Поскольку каждый объект в JS ведет себя как - и обычно реализуется как - хеш-таблица, я просто продолжаю с этим ...
источник
if (hashSweetHashTable.foo)
должен ввести блок if, еслиfoo
установлен.поэтому в C # код выглядит так:
или
в JavaScript
Словарь C # содержит полезные методы, как
dictionary.ContainsKey()
в JavaScript, мы могли бы использоватьhasOwnProperty
какисточник
hasOwnProperty
Если вы хотите, чтобы ваши ключи были любым объектом, а не просто строкой, вы можете использовать мою jshashtable .
источник
источник
{}
не массив:[]
илиnew Array()
если вы намереваетесь иметь строковые ключи, иначе у движка js есть проблема - он либо увидит 2 типа для 1 переменной, что означает отсутствие оптимизации, либо будет работать с массивом и реализует это должно измениться к объекту (возможное перераспределение).Я создал это для решения некоторых проблем, таких как сопоставление ключей объекта, возможность перечисления (с помощью
forEach()
метода) и очистки.Документация класса
Hashtable
Методы:
get(key)
Возвращает значение, связанное с указанным ключом.
Параметры::
key
ключ, из которого извлекается значение.put(key, value)
Связывает указанное значение с указанным ключом.
Параметры::
key
ключ, с которым связывается значение.value
: Значение для привязки к ключу.remove(key)
Удаляет указанный ключ с его значением.
Параметры::
key
ключ для удаления.clear()
Очищает всю хеш-таблицу, удаляя ключи и значения.
indexOfKey(key)
Возвращает индекс указанного ключа на основе порядка добавления.
Параметры::
key
ключ, из которого получают индекс.indexOfValue(value)
Возвращает индекс указанного значения на основе порядка добавления.
Параметры::
value
значение которого получить индекс.Примечания:
эта информация извлекается
indexOf()
методом массива, поэтому он сравнивает объект только сtoString()
методом.entryAt(index)
Возвращает объект с двумя свойствами: ключ и значение, представляющие запись по указанному индексу.
Параметры::
index
индекс записи для получения.containsKey(key)
Возвращает, содержит ли хеш-таблица указанный ключ.
Параметры::
key
ключ для проверки.containsValue(value)
Возвращает, содержит ли хеш-таблица указанное значение.
Параметры::
value
значение для проверки.forEach(iterator)
Итерирует все записи в указанном
iterator
.Параметры:
value
: Метод с 3 - мя параметрами:key
,value
иindex
, гдеindex
представляет собой индекс записи.Свойства:
length
( Только для чтения )Получает количество записей в хеш-таблице.
keys
( Только для чтения )Получает массив всех ключей в хеш-таблице.
values
( Только для чтения )Получает массив всех значений в хеш-таблице.
entries
( Только для чтения )Получает массив всех записей в хеш-таблице. Они представлены в одной и той же форме метода
entryAt()
.источник
https://gist.github.com/alexhawkins/f6329420f40e5cafa0a4
источник
Вы можете создать его, используя следующие:
источник