Mam bardzo duży obiekt JSON o następującej strukturze:
{A : 1, B : 2, C : 3, D : 4}
Potrzebuję funkcji, która może zamienić wartości z kluczami w moim obiekcie i nie wiem, jak to zrobić. Potrzebowałbym takiego wyniku:
{1 : A, 2 : B, 3 : C, 4 : D}
Czy jest jakiś sposób, żebym mógł to zrobić, aby ręcznie utworzyć nowy obiekt, w którym wszystko jest zamienione?
Dzięki
function swap(obj) {return new Map(Object.entries(x).map([k, v] => [v, k]))}
Odpowiedzi:
Przykład tutaj FIDDLE nie zapomnij włączyć konsoli, aby zobaczyć wyniki.
Wersje ES6 :
Lub za pomocą Array.reduce () & Object.keys ()
Lub za pomocą Array.reduce () & Object.entries ()
źródło
możesz użyć funkcji lodash _.invert, ale może również użyć multivlaue
źródło
Korzystanie z ES6:
źródło
Pobierz klucze obiektu, a następnie użyj funkcji redukcji Array, aby przejść przez każdy klucz i ustawić wartość jako klucz, a klucz jako wartość.
źródło
W ES6 / ES2015 można łączyć korzystanie z Object.keys i zmniejszyć z nowym Object.assign funkcji, z funkcją strzałki oraz komputerowej nazwy właściwości dla całkiem proste rozwiązanie pojedynczej instrukcji.
Jeśli transpilujesz za pomocą operatora rozprzestrzeniania obiektów (etap 3 w momencie pisania tego), to uprości to nieco dalej.
Wreszcie, jeśli masz dostępne Object.entries (etap 4 w trakcie pisania), możesz wyczyścić logikę odrobinę bardziej (IMO).
źródło
Teraz, gdy mamy Object.fromEntries:
lub
źródło
Jako uzupełnienie odpowiedzi @joslarson i @jPO:
bez ES6 możesz użyć i operatora przecinka :
Object.keys
Array.reduce
Niektórym może się to wydawać brzydkie, ale jest to „trochę” szybsze, ponieważ
reduce
nie rozprzestrzenia wszystkich właściwościobj
każdej pętli.źródło
forEach
,map
lubreduce
. Uczyniłem tę odpowiedź, aby mieć jednoliniowe rozwiązanie bez potrzeby es6 i nadal być istotne pod względem szybkości / skuteczności.Próbować
Pokaż fragment kodu
źródło
Najkrótszy, jaki wymyśliłem, używając ES6.
źródło
Korzystanie z Ramdy :
źródło
Uważam, że lepiej wykonać to zadanie, używając modułu npm, np
invert-kv
.invert-kv : Odwróć klucz / wartość obiektu. Przykład: {foo: 'bar'} → {bar: 'foo'}
https://www.npmjs.com/package/invert-kv
źródło
Z czystą Ramdą w czystym i bezcelowym stylu:
Lub, z nieco bardziej zawiłą wersją ES6, nadal czysto funkcjonalną:
źródło
źródło
object
bierze?map
powinno robić, używasz go tutaj jakforEach
Oto czysta funkcjonalne wdrożenie skakaniu
keys
ivalues
w ES6:Maszynopis
JavaScript
źródło
To może sprawić, że twój obiekt będzie
{A : 1, B : 2, C : 3, D : 4}
podobny do tablicy, więc możesz miećźródło
Oto opcja, która zamieni klucze z wartościami, ale nie straci duplikatów, jeśli twój obiekt to: {a: 1, b: 2, c: 2}, zawsze zwróci tablicę w wyniku:
źródło