Muszę przechowywać niektóre statystyki za pomocą JavaScript w sposób, który zrobiłbym w C #:
Dictionary<string, int> statistics;
statistics["Foo"] = 10;
statistics["Goo"] = statistics["Goo"] + 1;
statistics.Add("Zoo", 1);
Czy w JavaScript jest Hashtable
coś takiego Dictionary<TKey, TValue>
?
Jak mogę przechowywać wartości w taki sposób?
javascript
dictionary
hashtable
George2
źródło
źródło
Odpowiedzi:
Użyj obiektów JavaScript jako tablic asocjacyjnych .
Utwórz obiekt za pomocą
Alternatywna składnia tego samego to:
Jeśli możesz także utworzyć klucz do wyceny map obiektów za pomocą następującej składni
źródło
new Array()
jest odrzucone. Artykuł w końcu wspomina o swoich wadach i sugerujenew Object()
lub{}
jako preferowane alternatywy, ale to już koniec i obawiam się, że większość czytelników nie zajdzie tak daleko.var obj1 = {}; var obj2 = {}; var table= {}; table[obj1] = "A"; table[obj2] = "B"; alert(table[obj1]); //displays B
ponieważ nie można rozróżnić kluczy obj1 i obj2; oba są konwertowane na ciąg znaków i po prostu stają się czymś w rodzaju „Object”. Całkowity błąd i sprawia, że serializacja bezpieczna dla typu z nienaruszonymi referencjami i cyklicznymi referencjami jest trudna lub nie działa w JavaScript. Jest to łatwe we Flashu / AS3.Point.prototype.equals = function(obj) { return (obj instanceof Point) && (obj.x === this.x) && (obj.y === this.y); };
for... in
słownikObject.keys
zapętla się nad jego kluczami, więc wydaje się , że jest tam źle umieszczony.Object.keys
Zwraca tablicę klawiszy ze słownika, afor... in
jeszcze przez pętle tablicy powyżej jego „kluczy”, które w tablicy mają swoje wskaźniki, a nie jego wartości.Jeśli pochodzisz z języka zorientowanego obiektowo, powinieneś sprawdzić ten artykuł .
źródło
Wszystkie nowoczesne przeglądarki obsługują obiekt javascript Map . Istnieje kilka powodów, dla których korzystanie z mapy jest lepsze niż obiekt:
Przykład:
Jeśli chcesz, aby klucze, do których nie ma odniesienia w innych obiektach, były usuwane , należy rozważyć użycie WeakMap zamiast mapy.
źródło
Map
to mało przydatne, gdy klucz jest obiektem, ale należy go porównywać według wartości, a nie odwołania.Jeśli nie masz konkretnego powodu, aby tego nie robić, po prostu użyj zwykłego obiektu. Do właściwości obiektów w JavaScript można się odwoływać za pomocą składni w stylu hashtable:
Zarówno elementy, jak
foo
ibar
elementy mogą być teraz określane jako:Oczywiście oznacza to, że twoje klucze muszą być ciągami znaków. Jeśli nie są łańcuchami, są konwertowane wewnętrznie na łańcuchy, więc może nadal działać, YMMV.
źródło
var hash = {}; hash[1] = "foo"; alert(hash["1"]);
ostrzega „foo”.var dict = {}; dict.key1 = "val1"; dict["key2"] = "val2";
element key1 dict może być przywoływany równo przez obadict["key1"]
idict.key1
.Ponieważ każdy obiekt w JS zachowuje się - i jest generalnie implementowany jako - tablica mieszająca, po prostu idę z tym ...
źródło
if (hashSweetHashTable.foo)
powinien wpisać if block, jeślifoo
jest ustawiony.więc w języku C # kod wygląda następująco:
lub
w JavaScript
Obiekt C # Słownik zawiera użyteczne metody jak
dictionary.ContainsKey()
w JavaScript możemy używaćhasOwnProperty
jakźródło
hasOwnProperty
Jeśli chcesz, aby twoje klucze były jakimiś obiektami, a nie tylko łańcuchami, możesz użyć mojej jshashtable .
źródło
źródło
{}
nie tablicy:[]
lubnew Array()
jeśli zamierzasz mieć klucze łańcuchowe, w przeciwnym razie silnik js ma problem - albo zobaczy 2 typy dla 1 zmiennej, co oznacza brak optymalizacji, albo będzie działał z tablicą i zrealizuje musi zmienić się w obiekt (możliwe ponowne przydzielenie).Stworzyłem to, aby rozwiązać pewien problem, taki jak mapowanie klucza obiektu, możliwość wyliczenia (
forEach()
metodą) i kasowanie.Dokumentacja klasy
Hashtable
Metody:
get(key)
Zwraca wartość powiązaną z określonym kluczem.
Parametry::
key
Klucz, z którego pobierana jest wartość.put(key, value)
Kojarzy określoną wartość z określonym kluczem.
Parametry::
key
Klucz, z którym powiązana jest wartość.value
: Wartość do skojarzenia z kluczem.remove(key)
Usuwa określony klucz z jego wartością.
Parametry::
key
Klucz do usunięcia.clear()
Czyści wszystkie tablice mieszające, usuwając zarówno klucze, jak i wartości.
indexOfKey(key)
Zwraca indeks określonego klucza na podstawie kolejności dodawania.
Parametry:: którego
key
klucz otrzymuje indeks.indexOfValue(value)
Zwraca indeks określonej wartości na podstawie kolejności dodawania.
Parametry:: których
value
wartość otrzymuje indeks.Uwagi:
Informacje te są pobierane
indexOf()
metodą tablic, więc porównuje obiekt tylko ztoString()
metodą.entryAt(index)
Zwraca obiekt o dwóch właściwościach: kluczu i wartości, reprezentujących wpis o określonym indeksie.
Parametry::
index
Indeks wpisu do pobrania.containsKey(key)
Zwraca, czy tablica skrótów zawiera określony klucz.
Parametry::
key
Klucz do sprawdzenia.containsValue(value)
Zwraca, czy tablica skrótów zawiera określoną wartość.
Parametry::
value
wartość do sprawdzenia.forEach(iterator)
Iteruje wszystkie wpisy w określonym
iterator
.Parametry:
value
: metoda z 3 parametrów:key
,value
iindex
, gdzieindex
reprezentuje indeks wpisu.Nieruchomości:
length
( Tylko do odczytu )Pobiera liczbę wpisów w tablicy mieszającej.
keys
( Tylko do odczytu )Pobiera tablicę wszystkich kluczy w tablicy mieszającej.
values
( Tylko do odczytu )Pobiera tablicę wszystkich wartości w tablicy mieszającej.
entries
( Tylko do odczytu )Pobiera tablicę wszystkich wpisów w tablicy mieszającej. Są reprezentowane w tej samej formie metody
entryAt()
.źródło
https://gist.github.com/alexhawkins/f6329420f40e5cafa0a4
źródło
Możesz utworzyć taki, korzystając z poniższych:
źródło