Z postu:
Wysyłanie tablicy JSON do odebrania jako Słownik <ciąg, ciąg>
Próbuję zrobić to samo co ten post. Jedynym problemem jest to, że nie wiem, jakie klucze i wartości są z góry. Muszę więc być w stanie dynamicznie dodawać pary klucz i wartość i nie wiem, jak to zrobić.
Czy ktoś wie, jak stworzyć ten obiekt i dynamicznie dodawać pary kluczowych wartości?
Próbowałem:
var vars = [{key:"key", value:"value"}];
vars[0].key = "newkey";
vars[0].value = "newvalue";
Ale to nie działa.
javascript
dictionary
key-value
KenEucker
źródło
źródło
list = [["key1","value1"],["key2","value2"]]
. Niektóre inne języki mają typ „pary” lub „krotki”. tldr do faktycznego dodania:dict['key'] = "value"
Odpowiedzi:
Zasadniczo tworzysz literał obiektu z 2 właściwościami (nazywanymi
key
ivalue
) i wstawiasz go (za pomocąpush()
) do tablicy.Edycja: A więc prawie 5 lat później ta odpowiedź jest negatywna, ponieważ nie tworzy „normalnego” dosłownego obiektu JS (aka map, aka hash, aka słownik).
To jest jednak tworząc strukturę PO zażądano (i które są zilustrowane w innych kwestii związanych z), która jest tablicą literałach obiektów , z których każdy
key
, avalue
właściwości. Nie pytaj mnie, dlaczego ta struktura była wymagana, ale o tę poproszono.Ale, ale jeśli chcesz tego w prostym obiekcie JS - a nie o strukturę, o którą prosi OP - zobacz odpowiedź tcll , chociaż notacja w nawiasach jest nieco kłopotliwa, jeśli masz tylko proste klucze, które są prawidłowymi nazwami JS. Możesz po prostu to zrobić:
Lub użyj zwykłej notacji kropkowej, aby ustawić właściwości po utworzeniu obiektu:
Ty nie chcesz notacji nawiasu jeśli masz klucze, które mają spacje w nich znaki specjalne lub takie rzeczy. Na przykład:
Chcesz także notacji nawiasowej, jeśli twoje klucze są dynamiczne:
Zauważ, że klucze (nazwy właściwości) są zawsze ciągami, a wartości nie łańcuchowe będą wymuszone na łańcuch, gdy zostaną użyte jako klucz. Np.
Date
Obiekt zostaje przekonwertowany na jego reprezentację ciągu:Zauważ jednak, że to niekoniecznie „po prostu działa”, ponieważ wiele obiektów będzie miało ciąg znaków,
"[object Object]"
co nie oznacza, że nie jest unikalny klucz. Uważaj więc na coś takiego:Mimo
objA
iobjB
będąc całkowicie różnych i unikalnych elementów, oba mają taką samą podstawową reprezentację ciąg:"[object Object]"
.Powodem
Date
tego nie jest to, żeDate
prototyp ma niestandardowątoString
metodę, która zastępuje domyślną reprezentację ciągu. Możesz zrobić to samo:(Należy zauważyć, że ponieważ powyższe używa liczb losowych , kolizje nazw mogą nadal występować bardzo łatwo. To tylko ilustruje implementację
toString
.)Dlatego podczas próby użycia obiektów jako kluczy JS użyje własnej
toString
implementacji obiektu, jeśli istnieje, lub użyje domyślnej reprezentacji ciągu.źródło
dict
nie jest słownikiem asocjacyjnym. Jest to tablica obiektów, z których każdy jest trochę jak słownik z dwoma kluczami: „klucz” i „wartość”.działa jak python :)
wyjście konsoli:
źródło
{}
zamiast w nawiasachTo tak proste, jak:
lub
następnie
źródło
Ponieważ oświadczyłeś, że chcesz obiekt słownika (a nie tablicę, jak zakładam, niektórzy rozumieją), myślę, że właśnie o to ci chodzi:
źródło
JavaScript
Object
jest sam w sobie jak słownik. Nie trzeba wymyślać koła na nowo.Skrzypce
źródło
Możesz używać map z
Map
:źródło
Zdarzyło mi się przejść przez to pytanie w poszukiwaniu czegoś podobnego. Dało mi to wystarczającą ilość informacji, aby przeprowadzić test, aby uzyskać odpowiedź, której chciałem. Jeśli więc ktoś inny chce wiedzieć, jak dynamicznie dodawać lub wyszukiwać parę {klucz: „wartość”} w obiekcie JavaScript, ten test powinien powiedzieć ci wszystko, co możesz wiedzieć.
wynik
źródło
źródło
key1 = dictionary.key1
zamiast indeksowaćkey1 = dictionary["key1"]
Możesz utworzyć Słownik klasowy, aby łatwo wchodzić w interakcje z listą Słownik:
źródło
co powiesz na jedną linijkę do tworzenia pary klucz-wartość?
a niektóre funkcje iteratora, takie jak
reduce
dynamiczna konwersja tablicy do słownikaźródło
We współczesnym javascript (ES6 / ES2015) należy używać struktury danych mapy dla słownika. Struktura danych mapy w ES6 pozwala używać dowolnych wartości jako kluczy.
Jeśli nadal używasz ES5, poprawnym sposobem na utworzenie słownika jest utworzenie obiektu bez prototypu w następujący sposób.
Istnieje wiele zalet tworzenia słownika bez obiektu prototypowego. Poniżej blogi warto przeczytać na ten temat.
wzór dykt
obiekty jako mapy
źródło
Pomogłoby to tonie dowiedzieć się, jaki jest twój końcowy pożądany rezultat, ale myślę, że tego właśnie chcesz:
źródło
Natrafiłem na ten problem .. ale w pętli for. Najważniejsze rozwiązanie nie działało (podczas używania zmiennych (a nie ciągów) dla parametrów funkcji push), a inne nie uwzględniały kluczowych wartości opartych na zmiennych. Byłem zaskoczony, że to podejście (które jest powszechne w php) zadziałało.
źródło
Ulepszeniem
var dict = {}
jest użycievar dict = Object.create(null)
.Spowoduje to utworzenie pustego obiektu, którego nie ma
Object.prototype
jako prototypu.źródło
źródło