Jeśli mam obiekt JavaScript, taki jak:
var list = {
"you": 100,
"me": 75,
"foo": 116,
"bar": 15
};
Czy istnieje sposób sortowania właściwości według wartości? Tak więc skończę z
list = {
"bar": 15,
"me": 75,
"you": 100,
"foo": 116
};
javascript
sorting
properties
object
Steerpike
źródło
źródło
Object.entries
odpowiedź, która jest najczystszym i najbardziej czytelnym stanem wiedzy od ES2017: stackoverflow.com/a/37607084/245966Odpowiedzi:
Przenieś je do tablicy, posortuj tę tablicę, a następnie użyj tej tablicy do swoich celów. Oto rozwiązanie:
Gdy już będziesz mieć tablicę, możesz odbudować obiekt z tablicy w wybranej przez siebie kolejności, osiągając dokładnie to, co masz zamiar zrobić. Działa to we wszystkich przeglądarkach, o których wiem, ale byłoby to zależne od dziwactwa implementacyjnego i może się zepsuć w dowolnym momencie. Nigdy nie należy przyjmować założeń dotyczących kolejności elementów w obiekcie JavaScript.
źródło
keys()
jest obsługiwany tylko przez IE9 + (i inne nowoczesne przeglądarki), jeśli to dotyczy.keys()
Wyklucza również wyliczalne właściwości z łańcucha prototypów elementów (w przeciwieństwie do for..in) - ale jest to zwykle bardziej pożądane._.pairs
zamienia obiekt w [[klucz1, wartość1], [klucz2, wartość2]]. Następnie wywołaj sort na ten temat. Następnie zadzwoń_.object
, aby cofnąć.Nie chcemy powielać całej struktury danych ani używać tablicy, w której potrzebujemy tablicy asocjacyjnej.
Oto inny sposób na zrobienie tego samego, co bonna:
źródło
keysSorted
jest tablicą! Nie przedmiot!.map(key => list[key]);
na końcu tego rodzaju, zwróci cały obiekt zamiast tylko kluczaTwoje obiekty mogą mieć dowolną liczbę właściwości i możesz sortować według dowolnej właściwości obiektu, liczby lub łańcucha, jeśli umieścisz obiekty w tablicy. Rozważ tę tablicę:
sortuj według daty urodzenia, najpierw najstarszej
sortuj według nazwy
http://jsfiddle.net/xsM5s/16/
źródło
substr
wyróżniać pierwszego znaku; jeszczeDiana
iDebra
mieć niezdefiniowany porządek. Ponadto twójbyDate
rodzaj faktycznie używanum
, a nieborn
.x.localeCompare(y)
localCompare
wygląda na bardzo przydatną funkcję! Pamiętaj, że nie będzie obsługiwany w każdej przeglądarce - IE 10 i mniej, Safari Mobile 9 i mniej.Dla zachowania kompletności ta funkcja zwraca posortowaną tablicę właściwości obiektu:
Jsfiddle z powyższym kodem jest tutaj . To rozwiązanie jest oparte na tym artykule .
Zaktualizowany skrzypce do sortowania ciągów jest tutaj. Możesz usunąć zarówno dodatkowe konwersje .toLowerCase () w celu porównania ciągów znaków z rozróżnianiem wielkości liter.
źródło
ECMAScript 2017 wprowadza
Object.values / Object.entries
. Jak sama nazwa wskazuje, pierwsza z nich agreguje wszystkie wartości obiektu w tablicę, a druga łączy cały obiekt w tablicę[key, value]
tablic; Odpowiednikdict.values()
idict.items()
.Funkcje ułatwiają sortowanie dowolnego skrótu w uporządkowanym obiekcie. Na razie obsługuje je tylko niewielka część platform JavaScript , ale możesz wypróbować ją w przeglądarce Firefox 47+.
źródło
Sorting JavaScript Object by property value
? myślę, że źle zrozumiałeś pytanie, ponieważ musisz zmienić oryginalny Obiekt i nie tworzyć z niego nowej Tablicy.Określenie „strzałką” wersja @marcusR „s odpowiedź odsyłającego
AKTUALIZACJA: kwiecień 2017 r. - Zwraca posortowany
myObj
obiekt zdefiniowany powyżej.Wypróbuj tutaj!
AKTUALIZACJA: październik 2018 r. - Wersja Object.entries
Wypróbuj tutaj!
źródło
var myObj = {"1": {"Value": 40}, "2": {"Value": 10}, "3": {"Value": 30}, "4": {"Value": 20}};
entries
. Zgodnie ze standardem obiekt jest nieuporządkowanym zbiorem właściwości . Oznacza to, że jeśli próbujesz zbudować nowy obiekt po posortowaniu go według wartości właściwości lub czegokolwiek innego, kolejność kluczy właściwości staje się ponownie niezdefiniowana. Na przykład Chrome domyślnie porządkuje klucze właściwości, dlatego każda próba uporządkowania ich inaczej jest bezużyteczna. Jedyną szansą jest uzyskanie „indeksu” na podstawie preferencji dotyczących zamawiania i odpowiednie przejście do oryginalnego obiektu.sort()
naObject.entries()
Obiekty JavaScript są z definicji nieuporządkowane (patrz specyfikacja języka ECMAScript , rozdział 8.6). Specyfikacja języka nawet nie gwarantuje, że jeśli powtórzysz właściwości obiektu dwa razy pod rząd, pojawią się one w tej samej kolejności za drugim razem.
Jeśli potrzebujesz rzeczy do zamówienia, użyj tablicy i metody Array.prototype.sort.
źródło
OK , jak zapewne wiesz, javascript ma funkcję sort () do sortowania tablic, ale nic dla obiektu ...
W takim przypadku musimy jakoś pobrać tablicę kluczy i posortować je, dlatego api daje ci większość obiektów w tablicy, ponieważ tablica ma więcej rodzimych funkcji do zabawy z nimi niż dosłownie obiekt, szybkim rozwiązaniem jest użycie Object.key, które zwracają tablicę kluczy obiektowych, tworzę ES6 poniżej, która wykonuje za ciebie zadanie, używa natywnych funkcji sort () i redukuj () w javascript:
A teraz możesz użyć tego w następujący sposób:
Sprawdź sortedMyObject i możesz zobaczyć wynik posortowany według następujących kluczy:
Również w ten sposób główny obiekt nie zostanie dotknięty i faktycznie otrzymamy nowy obiekt.
Tworzę również poniższy obrazek, aby uczynić kroki funkcji bardziej wyraźnymi, na wypadek, gdyby trzeba było trochę je zmienić, aby działały po swojemu:
źródło
c: 3
na,c: 13
a zobaczysz, jak się rozpada.źródło
Zaktualizuj za pomocą ES6: Jeśli twoja obawa dotyczy posortowanego obiektu do iteracji (dlatego wyobrażam sobie, że chcesz posortować właściwości obiektu), możesz użyć obiektu Map .
Możesz wstawić pary (klucz, wartość) w posortowanej kolejności, a następnie wykonanie
for..of
pętli zagwarantuje, że będą one zapętlone w kolejności, w której je wstawiłeśźródło
for-in
lubObject.keys
, ale jest zdefiniowana jako przestrzegana przezObject.getOwnPropertyNames
inne nowe metody dostępu do tablic nazw właściwości. To kolejna opcja.Map
że w rzeczywistości masz strukturę danych, która może przechowywać w posortowanej kolejności (sortuj dane, przeglądaj je i przechowuj na mapie), ponieważ nie masz gwarancji, że dzięki przedmiotyUnderscore.js lub Lodash.js do zaawansowanego sortowania tablic lub obiektów
próbny
źródło
Bardzo krótki i prosty!
źródło
Postępuję zgodnie z rozwiązaniem podanym przez slebetman (przeczytaj wszystkie szczegóły), ale dostosowałem, ponieważ twój obiekt nie jest zagnieżdżony.
źródło
Sortuj wartości bez wielu pętli for (aby sortować według kluczy, zmień indeks w wywołaniu zwrotnym sortowania na „0”)
źródło
Może to być prosty sposób, aby potraktować go jako obiekt naprawdę uporządkowany. Nie jestem pewien, jak wolno. również może być lepiej z pętlą while.
A potem znalazłem tę funkcję inwersji z: http://nelsonwells.net/2011/10/swap-object-key-and-values-in-javascript/
Więc
źródło
output = [{p: 8}, {c: 2}, {b: 1}, {g: 1}]
źródło
Na wszelki wypadek ktoś szuka utrzymania obiektu (z kluczami i wartościami), korzystając z odwołania do kodu autorstwa @ Markus R i komentarza @James Moran, wystarczy użyć:
źródło
map
forEach
Wynik:
źródło
wiele podobnych i przydatnych funkcji: https://github.com/shimondoodkin/groupbyfunctions/
źródło
Obiekt posortowany według wartości (DESC)
źródło
Oto jeszcze jeden przykład:
źródło
źródło
Maszynopis
Poniższa funkcja sortuje obiekt według wartości lub właściwości wartości. Jeśli nie używasz TypeScript, możesz usunąć informacje o typie, aby przekonwertować je na JavaScript.
Stosowanie
Kolejność kluczy w obiekcie JavaScript nie jest gwarantowana, więc sortuję i zwracam wynik jako
Map
obiekt, który zachowuje porządek sortowania.Jeśli chcesz przekonwertować go z powrotem na obiekt, możesz to zrobić:
źródło
dane wejściowe są obiektami, dane wyjściowe są obiektami, przy użyciu wbudowanej biblioteki libash & js, z opcją malejącą lub rosnącą i nie powoduje mutacji obiektu wejściowego
np. wejście i wyjście
Implementacja
źródło
źródło
moje rozwiązanie z sortowaniem:
źródło
źródło
Innym sposobem rozwiązania tego jest:
// res będzie miała tablicę wyników
źródło
Dziękuję i kontynuuj odpowiedź @Nosredna
Teraz, gdy rozumiemy, obiekt należy przekonwertować na tablicę, a następnie posortować tablicę. jest to przydatne do sortowania tablicy (lub przekonwertowanego obiektu na tablicę) według łańcucha:
źródło
Spróbuj tego. Nawet twój obiekt nie ma właściwości, na podstawie której próbujesz sortować, również zostanie obsłużony.
Po prostu wywołaj go, wysyłając właściwość z obiektem.
źródło