Chcę przekonwertować taki obiekt:
{"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
w tablicę par klucz-wartość, takich jak to:
[[1,5],[2,7],[3,0],[4,0]...].
Jak przekonwertować obiekt na tablicę par klucz-wartość w JavaScript?
javascript
arrays
type-conversion
Soptareanu Alex
źródło
źródło
NaN
zamiast tego wróci . Jeśli chcesz używać ciągów jako kluczy, zmień zwrot z[Number(key), obj[key]]
na[key, obj[key]]
lub skorzystaj zObject.entries
sugestii @Pila w odpowiedziNajlepszym sposobem jest:
Dzwonienie
entries
, jak pokazano tutaj, zwróci[key, value]
pary, zgodnie z prośbą pytającego.Alternatywnie możesz zadzwonić
Object.values(obj)
, co zwróci tylko wartości.źródło
Że
Object.entries
funkcja zwraca niemal dokładna wyjście pytasz za wyjątkiem klawiszy są ciągi zamiast numerów.Jeśli potrzebujesz, aby klucze były cyframi, możesz odwzorować wynik na nową tablicę z funkcją wywołania zwrotnego, która zastępuje klucz w każdej parze liczbą wymuszoną z niego.
Używam funkcji strzałki i
Object.assign
do wywołania zwrotnego mapy w powyższym przykładzie, dzięki czemu mogę zachować ją w jednej instrukcji, wykorzystując fakt, żeObject.assign
zwraca obiekt, do którego jest przypisany, a wartość zwracana przez funkcję pojedynczej instrukcji jest wynikiem instrukcji.Jest to równoważne z:
Jak wspomniano w komentarzach @TravisClarke, funkcję mapy można skrócić do:
Jednak stworzyłoby to nową tablicę dla każdej pary klucz-wartość, zamiast modyfikować istniejącą tablicę w miejscu, podwajając liczbę utworzonych tablic pary klucz-wartość. Chociaż tablica oryginalnych wpisów jest nadal dostępna, to i jej wpisy nie będą usuwane.
Teraz, mimo że nasza metoda lokalna nadal używa dwóch tablic, które przechowują pary klucz-wartość (tablice wejściowa i wyjściowa), całkowita liczba tablic zmienia się tylko o jeden. Tablice wejściowe i wyjściowe nie są tak naprawdę wypełnione tablicami, ale raczej referencje do tablic i te referencje zajmują mało miejsca w pamięci.
Możesz pójść o krok dalej i całkowicie wyeliminować wzrost, modyfikując tablicę wpisów w miejscu zamiast mapować ją na nową tablicę:
źródło
Object.entries(obj).map(e => [+e[0], e[1]]);
Podsumowując niektóre z tych odpowiedzi teraz w 2018 r., Gdzie ES6 jest standardem.
Począwszy od obiektu:
Ta ostatnia metoda może również reorganizować kolejność tablic w zależności od wartości kluczy. Czasami może to być pożądane zachowanie (czasem nie). Ale zaletą jest teraz to, że wartości są indeksowane w odpowiednim gnieździe tablicowym, co jest niezbędne i trywialne do wyszukiwania na nim.
Na koniec (nie jest częścią pierwotnego pytania, ale dla kompletności), jeśli chcesz łatwo wyszukiwać za pomocą klucza lub wartości, ale nie chcesz rzadkich tablic, żadnych duplikatów i ponownego zamawiania bez konieczności konwersji na klucze numeryczne ( nawet może uzyskać dostęp do bardzo złożonych kluczy), wtedy tablica (lub obiekt) nie jest tym, czego potrzebujesz. Ja polecam
Map
zamiast:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
źródło
Jeszcze jedno rozwiązanie, jeśli
Object.entries
nie zadziała dla Ciebie.źródło
W Ecmascript 6
skrzypce
źródło
.map((value)=>(value))
część jest bez znaczenia - po prostu zwraca tablicę wejściową dokładnie równoważną do tej uzyskanej zObject.entries(obj)
wywołania.Zastosowanie
Object.keys
iArray#map
metody.źródło
Użyj,
Object.entries
aby uzyskać każdy element obiektu wkey & value
formacie, a następniemap
przez niego w następujący sposób:Ale jeśli masz pewność, że klucze będą w kolejności progresywnej, możesz użyć
Object.values
iArray#map
zrobić coś takiego:źródło
Jeśli używasz lodash, może to być tak proste:
źródło
Z lodash, oprócz odpowiedzi podanej powyżej, możesz również mieć klucz w tablicy wyjściowej.
Bez kluczy obiektów w tablicy wyjściowej
dla:
Jeśli obj jest następujące:
Zatem tablica będzie:
Z kluczami obiektowymi w tablicy wyjściowej
Jeśli zamiast tego napiszesz („gatunek” to wybrany przez Ciebie ciąg):
Dostaniesz:
źródło
Sugerowałbym to najprostsze rozwiązanie
Object.entries()
źródło
Możesz użyć
Object.values([])
, możesz potrzebować tego wypełnienia, jeśli jeszcze tego nie zrobiłeś:https://stackoverflow.com/a/54822153/846348
Następnie możesz po prostu zrobić:
Pamiętaj tylko, że tablice w js mogą używać tylko klawiszy numerycznych, więc jeśli użyjesz czegoś innego w obiekcie, wówczas staną się one „0,1,2 ... x”
Przydatne może być usunięcie duplikatów, na przykład, jeśli masz unikalny klucz.
źródło
Użyj dla w
źródło
Rekurencyjny obiekt konwersji na tablicę
źródło
Możemy zmienić Number na Type String dla Key jak poniżej:
źródło
źródło
Oto moja prosta implementacja barebone:
źródło
Proste rozwiązanie
`
źródło
możesz użyć _.castArray (obj) .
przykład:
_.castArray({ 'a': 1 }); // => [{ 'a': 1 }]
źródło