Muszę sortować obiekty JavaScript według klucza.
Stąd następujące:
{ 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' }
Stanie się:
{ 'a' : 'dsfdsfsdf', 'b' : 'asdsad', 'c' : 'masdas' }
javascript
sorting
vdh_ant
źródło
źródło
Object.entries
iObject.fromEntries
dodawane do JS, można to osiągnąć za pomocą ładnie krótkiejObject.fromEntries(Object.entries(obj).sort())
Odpowiedzi:
Inne odpowiedzi na to pytanie są nieaktualne, nigdy nie pasowały do rzeczywistości implementacyjnej i oficjalnie stały się niepoprawne po opublikowaniu specyfikacji ES6 / ES2015.
Zobacz sekcję dotyczącą kolejności iteracji właściwości w Exploring ES6 autorstwa Axela Rauschmayera :
Tak, tak, obiekty JavaScript są w rzeczywistości uporządkowane, a kolejność ich kluczy / właściwości można zmienić.
Oto, w jaki sposób możesz posortować obiekt według jego kluczy / właściwości, alfabetycznie:
Użyj
var
zamiastconst
dla kompatybilności z silnikami ES5.źródło
Obiekty JavaScript 1 nie są uporządkowane. Nie ma sensu „sortować” ich. Jeśli chcesz wykonać iterację właściwości obiektu, możesz posortować klucze, a następnie pobrać powiązane wartości:
Alternatywne wdrożenie z wykorzystaniem
Object.keys
fanciness:1 Nie być pedantycznym, ale nie ma czegoś takiego jak obiekt JSON .
źródło
{"a", 1}
jak JSON Array jest dokładnym terminem na ciąg znaków[1]
. Przydaje się możliwość komunikowania się poprzez wypowiadanie takich rzeczy, jak trzeci obiekt w mojej tablicy, gdy masz ciąg[{x: 1}, {y: 2}, {z: 3}]
, więc wolę „To nie jest obiekt JSON”, gdy komentuję dosłowność Javascript, niż „Nie ma takiego rzecz jako obiekt JSON ”, który po prostu spowoduje więcej zamieszania i trudności w komunikacji później, gdy OP faktycznie będzie współpracował z JSON.{"a", 1}
jest literałem obiektu lub tekstem JSON (inaczej JSON string, jeśli naprawdę wolisz). To, co to jest, zależy od kontekstu, ten pierwszy, jeśli pojawia się dosłownie w kodzie źródłowym JavaScript, ten drugi, jeśli jest to ciąg, który należy przekazać do parsera JSON, aby go dalej użyć. Istnieją prawdziwe różnice między nimi, jeśli chodzi o dozwoloną składnię, prawidłowe użycie i serializację.Wiele osób wspomniało, że „obiektów nie można sortować” , ale potem dają ci rozwiązanie, które działa. Paradoks, prawda?
Nikt nie wspomina, dlaczego te rozwiązania działają. Są, ponieważ w większości implementacji przeglądarki wartości w obiektach są przechowywane w kolejności, w jakiej zostały dodane. Dlatego jeśli tworzysz nowy obiekt z posortowanej listy kluczy, zwraca oczekiwany wynik.
I myślę, że moglibyśmy dodać jeszcze jedno rozwiązanie - funkcjonalny sposób ES5:
Powyższa wersja ES2015 (sformatowana jako „one-liner”):
Krótkie wyjaśnienie powyższych przykładów (zgodnie z pytaniami w komentarzach):
Object.keys
daje nam listę kluczy w podanym obiekcie (obj
lubo
), następnie sortujemy je za pomocą domyślnego algorytmu sortowania, następnie.reduce
służy do konwersji tej tablicy z powrotem na obiekt, ale tym razem z posortowanymi wszystkimi kluczami.źródło
for...in
).Object.keys(dict).sort().reduce((r, k) => Object.assign(r, { [k]: dict[k] }), {});
Chłopaki jestem w szoku w przenośni! Oczywiście wszystkie odpowiedzi są nieco stare, ale nikt nawet nie wspomniał o stabilności sortowania! Więc proszę o cierpliwość, postaram się jak najlepiej odpowiedzieć na pytanie i przejść do szczegółów tutaj. Przepraszam, więc będzie dużo do przeczytania.
Ponieważ jest 2018, będę używać tylko ES6, wszystkie polifill są dostępne w dokumentach MDN, które podlinkuję w danej części.
Odpowiedz na pytanie:
Jeśli twoje klucze są tylko cyframi, możesz bezpiecznie użyć
Object.keys()
razem z,Array.prototype.reduce()
aby zwrócić posortowany obiekt:Jednak jeśli pracujesz z łańcuchami, bardzo polecam połączenie tego
Array.prototype.sort()
wszystkiego:Jeśli ktoś zastanawia się, co robi redukcja:
W razie potrzeby znajduje się wyjaśnienie dla jednej wkładki:
Dlaczego sortowanie jest trochę skomplikowane:
W skrócie
Object.keys()
zwróci tablicę o takiej samej kolejności, jak w przypadku normalnej pętli:Sidenote - możesz używać również
Object.keys()
na tablicach, pamiętaj, że indeks zostanie zwrócony:Ale nie jest to tak łatwe, jak pokazano w tych przykładach, obiekty świata rzeczywistego mogą zawierać liczby i znaki alfabetyczne, a nawet symbole (nie rób tego).
Oto przykład z nimi wszystkimi w jednym obiekcie:
Teraz, jeśli użyjemy
Array.prototype.sort()
tablicy powyżej zmiany danych wyjściowych:Oto cytat z dokumentów:
Musisz upewnić się, że jeden z nich zwróci dla Ciebie żądane wyjście. W rzeczywistych przykładach ludzie mają tendencję do pomieszania rzeczy, szczególnie jeśli używasz różnych danych wejściowych, takich jak interfejsy API i bazy danych.
Więc o co chodzi?
Cóż, są dwa artykuły, które każdy programista powinien zrozumieć:
Algorytm lokalny :
Więc w zasadzie nasza stara tablica zostanie nadpisana! Jest to ważne, jeśli chcesz zachować starą tablicę z innych powodów. Miej to na uwadze.
Algorytm sortowania
To pokazuje, że sortowanie jest prawidłowe, ale się zmieniło. Tak więc w prawdziwym świecie, nawet jeśli sortowanie jest prawidłowe, musimy upewnić się, że otrzymamy to, czego oczekujemy! To bardzo ważne, należy o tym pamiętać. Więcej przykładów JavaScript można znaleźć w Array.prototype.sort () - docs: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
źródło
Object.keys(testObj).sort().reduce((a, c) => (a[c] = testObj[c], a), {})
.{5: 'hearts'}
lub{5: 'spades'}
zaczniesz sortować tablicę, stanie się ona potencjalnie niestabilna w grach takich jak remika. Nie mówiąc już o różnych językach.To działa dla mnie
źródło
Jest rok 2019 i mamy sposób na rozwiązanie tego w 2019 roku :)
źródło
tutaj jest 1 wkładka
źródło
(o[k] = v, o)
. Dlaczego to w ogóle działa, gdzie mogę znaleźć dokumenty na ten temat? Oczywiście zwraca najbardziej prawy parametr, ale dlaczego?o[k]
równa,v
a następnie zwracao
To stare pytanie, ale biorąc pod uwagę odpowiedź Mathiasa Bynensa, stworzyłem krótką wersję, aby posortować bieżący obiekt, bez większego obciążenia.
po wykonaniu kodu sam „nieuporządkowany” obiekt będzie posortowany alfabetycznie.
źródło
Przy użyciu lodash będzie to działać:
Tylko jedzenie do namysłu.
źródło
Załóżmy, że może to być przydatne w debuggerze VisualStudio, który pokazuje nieuporządkowane właściwości obiektu.
źródło
Wersja podkreślenia :
Jeśli nie ufasz przeglądarce, że zachowuje porządek kluczy, zdecydowanie sugeruję, aby polegać na uporządkowanej tablicy sparowanych tablic klucz-wartość.
źródło
_.object(_.sortBy(_.pairs(unordered), _.first))
źródło
Może nieco bardziej elegancka forma:
PS i to samo ze składnią ES6 +:
źródło
sortowanie rekurencyjne, dla zagnieżdżonych obiektów i tablic
źródło
else
tam - może być prawdą dla obuArray.isArray(obj[key])
i dlatypeof obj[key] === 'object'
function sortObjectKeys(obj){
::if(typeof obj != 'object'){ /* it is a primitive: number/string (in an array) */ return obj; }
. Dla solidności I na samym początku dodałem również:if(obj == null || obj == undefined){ return obj; }
Jak już wspomniano, obiekty są nieuporządkowane.
Jednak...
Ten idiom może ci się przydać:
Następnie możesz iterować przez kv i robić, co chcesz.
źródło
Oto czysta wersja oparta na lodash, która działa z zagnieżdżonymi obiektami
Byłoby jeszcze czystsze, gdyby lodash miał
toObject()
metodę ...źródło
Wystarczy użyć lodash, aby rozpakować mapę i sortować.Pierwsza wartość pary i zip ponownie zwróci posortowany klucz.
Jeśli chcesz posortować wartość, zmień indeks par na 1 zamiast 0
źródło
Sortuje klucze rekurencyjnie, zachowując odwołania.
Przykład:
źródło
delete o[e[0]];
? Czy nie możemy po prostu przypisać?źródło
Jest to lekkie rozwiązanie do wszystkiego, czego potrzebuję do sortowania JSON.
źródło
Użyj tego kodu, jeśli zagnieżdżałeś obiekty lub zagnieżdżałeś tablicę obj.
źródło
Rozwiązanie:
Wyjaśnienie:
Wiele środowisk wykonawczych JavaScript zapisuje wartości wewnątrz obiektu w kolejności, w jakiej są dodawane.
Aby posortować właściwości obiektu według kluczy, możesz skorzystać z funkcji Object.keys, która zwróci tablicę kluczy. Tablicę kluczy można następnie posortować za pomocą Array.prototype.sort () metody , która sortuje elementy tablicy w miejscu (nie trzeba przypisywać ich do nowej zmiennej).
Po posortowaniu kluczy możesz zacząć używać ich jeden po drugim, aby uzyskać dostęp do zawartości starego obiektu w celu wypełnienia nowego obiektu (który jest teraz posortowany).
Poniżej znajduje się przykład procedury (możesz to przetestować w wybranych przeglądarkach):
Uwaga: Object.keys to metoda ECMAScript 5.1, ale tutaj jest wypełnianie wielu starszych przeglądarek:
źródło
Przekazałem niektóre wyliczenia Java do obiektów javascript.
Te obiekty zwróciły dla mnie prawidłowe tablice. jeśli klucze obiektów są typu mieszanego (string, int, char), istnieje problem.
Pokaż fragment kodu
źródło
Prosty i czytelny fragment kodu, korzystający z lodash.
Musisz wpisać klucz w cudzysłów tylko podczas wywoływania sortBy. Nie musi zawierać cudzysłowów w samych danych.
Ponadto drugi parametr do mapowania jest nieprawidłowy. Powinna to być funkcja, ale łatwiejsze jest używanie skubania.
źródło
Jest świetny projekt @sindresorhus o nazwie sort-keys, który działa niesamowicie.
Możesz sprawdzić jego kod źródłowy tutaj:
https://github.com/sindresorhus/sort-keys
Możesz też użyć go z npm:
Oto także przykłady kodu z jego pliku readme
źródło
Czysta odpowiedź JavaScript do sortowania obiektu. To jedyna znana mi odpowiedź, która poradzi sobie z liczbami ujemnymi. Ta funkcja służy do sortowania obiektów numerycznych.
Wpisz obj = {1000: {}, -1200: {}, 10000: {}, 200: {}};
Wyjściem będzie obiekt posortowany według tych liczb z nowymi kluczami zaczynającymi się od 0.
źródło
Aby to uprościć i wyjaśnić odpowiedź Matt Ball
źródło
Nie jestem pewien, czy to odpowiada na pytanie, ale tego właśnie potrzebowałem.
Nazywany jako:
źródło
Jedna linia:
źródło
najlepszym sposobem na to jest
Możesz najpierw przekonwertować prawie podobny do tablicy obiekt na prawdziwą tablicę, a następnie użyć .reverse ():
Puste miejsce na końcu, jeśli powoduje, ponieważ twój pierwszy indeks to 1 zamiast 0. Możesz usunąć puste miejsce za pomocą .length-- lub .pop ().
Alternatywnie, jeśli chcesz pożyczyć .reverse i wywołać go na tym samym obiekcie, musi to być obiekt w pełni tablicowy. Oznacza to, że potrzebuje właściwości length:
Zauważ, że zwróci ten sam obiekt obiektowy w pełni tablicowy, więc nie będzie to prawdziwa tablica. Następnie możesz użyć delete, aby usunąć właściwość length.
źródło