Mam tablicę obiektów z kilkoma parami kluczowych wartości i muszę je posortować na podstawie „updated_at”:
[
{
"updated_at" : "2012-01-01T06:25:24Z",
"foo" : "bar"
},
{
"updated_at" : "2012-01-09T11:25:13Z",
"foo" : "bar"
},
{
"updated_at" : "2012-01-05T04:13:24Z",
"foo" : "bar"
}
]
Jaki jest najbardziej efektywny sposób?
javascript
arrays
object
Ciasteczkowy potwór
źródło
źródło
Odpowiedzi:
Możesz użyć
Array.sort
.Oto przykład:
źródło
keyA - keyB
(lub ewentualniekeyB - keyA
)? Obiekty daty mająvalueOf()
metodę.a-b
jest naprawdę ważna, jeśli chcesz uniknąć długiego kodu. Podczas gdy długi kod niekoniecznie jest zły w tym przypadku, myślę, że gadatliwość utrudnia zrozumienie. Obecnie używamvalues.sort((a,b)=>a.attr-b.attr)
. Konieczność pisania 5 wierszy za każdym razem, gdy trzeba posortować tablicę, staje się nużąca.Odpowiedziałem już na bardzo podobne pytanie: prosta funkcja sortowania tablicy obiektów
Dla tego pytania stworzyłem tę małą funkcję, która może robić, co chcesz:
źródło
-1
:)array = array.reverse()
funkcji.Metoda Array.sort () sortuje elementy tablicy na miejscu i zwraca tablicę. Uważaj na Array.sort (), ponieważ nie jest ona niezmienna . Do sortowania niezmiennego użyj sortowania niezmiennego .
Ta metoda polega na sortowaniu tablicy przy użyciu prądu
updated_at
w formacie ISO. Używamynew Data(iso_string).getTime()
do konwersji czasu ISO na znacznik czasu Unix. Uniksowy znacznik czasu to liczba, na której możemy wykonywać proste obliczenia matematyczne. Odejmujemy pierwszy i drugi znacznik czasu, wynik jest; jeśli pierwszy znacznik czasu jest większy niż drugi, zwracana liczba będzie dodatnia. Jeśli druga liczba jest większa od pierwszej, zwracana wartość będzie ujemna. Jeśli dwa są takie same, zwrot wyniesie zero. To idealnie pasuje do wymaganych wartości zwracanych dla funkcji inline.W przypadku ES6 :
W przypadku ES5 :
Jeśli zmienisz swój
updated_at
na uniksowe znaczniki czasu, możesz to zrobić:W przypadku ES6 :
Dla ES5 :
W chwili pisania tego postu nowoczesne przeglądarki nie obsługują ES6. Aby używać ES6 we współczesnych przeglądarkach, użyj babel do transponowania kodu do ES5. W najbliższej przyszłości spodziewaj się obsługi przeglądarki ES6.
Array.sort () powinien otrzymać wartość zwrotną jednego z 3 możliwych wyników:
W przypadku sortowania niezmiennego: (przykład w ES6)
Możesz także napisać w ten sposób:
Zaimportowany plik to nowy sposób na włączenie javascript do ES6 i sprawia, że kod wygląda bardzo czysto. Mój osobisty faworyt.
Niezmienne sortowanie nie powoduje mutacji tablicy źródłowej, a zwraca nową tablicę. Używanie
const
jest zalecane w przypadku danych niezmiennych.źródło
Oto nieco zmodyfikowana wersja odpowiedzi @David Brainer-Bankers, która sortuje alfabetycznie według łańcucha lub liczbowo według liczby i zapewnia, że słowa zaczynające się od wielkich liter nie będą sortowane powyżej słów zaczynających się na małe litery (np. „Jabłko, wczesne” będą wyświetlane w tej kolejności).
źródło
Użyj podkreślenia js lub lodash,
_.sortBy()
zwraca nową tablicęodnoszą http://underscorejs.org/#sortBy i lodash docs https://lodash.com/docs#sortBy
źródło
Dzięki obsłudze ES2015 można to zrobić poprzez:
źródło
new Date(iso_str).getTime()
ten sposób zwróci znacznik czasu Unix.Dane zaimportowane
W porządku rosnącym
Przykład zamówienia Asc
W porządku malejącym
Przykład zamówienia opisu
źródło
Jak stwierdza ta odpowiedź, możesz użyć
Array.sort
.arr.sort(function(a,b){return new Date(a.updated_at) - new Date(b.updated_at)})
źródło
Kolejny, bardziej matematyczny sposób robienia tego samego, ale krótszy :
lub w zgrabnym stylu strzały lambda:
Metodę tę można wykonać przy użyciu dowolnego wprowadzania numerycznego
źródło
Na dzień dzisiejszy odpowiedzi @knowbody ( https://stackoverflow.com/a/42418963/6778546 ) i @Rocket Hazmat ( https://stackoverflow.com/a/8837511/6778546 ) można połączyć, aby zapewnić obsługę ES2015 i poprawna obsługa dat:
źródło
Stworzyłem funkcję sortowania w Typescript, której możemy używać do wyszukiwania ciągów, dat i liczb w tablicy obiektów. Może także sortować według wielu pól.
Stosowanie:
źródło
Sortowanie według daty sformatowanej według ISO może być kosztowne, chyba że ograniczysz klientów do najnowszych i najlepszych przeglądarek, które mogą utworzyć prawidłowy znacznik czasu, analizując ciąg znaków.
Jeśli jesteś pewien swoich danych wejściowych i wiesz, że zawsze będzie to rrrr-mm-ddThh: mm: ss i GMT (Z), możesz wyodrębnić cyfry z każdego elementu i porównać je jak liczby całkowite
Jeśli data może być sformatowana inaczej, może być konieczne dodanie czegoś dla osób z iso-wyzwanie:
źródło
Date.parse
?Dla kompletności tutaj jest możliwe krótkie ogólne wdrożenie sortBy:
Zauważ, że używa to metody sortowania tablic, która sortuje się w miejscu. dla kopii możesz użyć arr.concat () lub arr.slice (0) lub podobnej metody, aby utworzyć kopię.
źródło
Dzięki temu możemy przekazać kluczową funkcję do użycia przy sortowaniu
Na przykład, jeśli mamy
Możemy zrobić
lub
lub
źródło
Możesz użyć biblioteki narzędzi Lodash , aby rozwiązać ten problem (jest to dość wydajna biblioteka):
Dokumentację można znaleźć tutaj: https://lodash.com/docs/4.17.15#orderBy
źródło
Możesz stworzyć zamknięcie i przekazać to w ten sposób , działa mój przykład
źródło
źródło
Array.sort()
do sortowania tablicy…
), aby funkcja była czystaupdated_at
)Array.sort()
działa poprzez odjęcie dwóch właściwości od bieżącego i następnego elementu, jeśli jest to liczba / obiekt, na którym można wykonywać operacje arytmiczneźródło
Mam do czynienia z tą samą rzeczą, więc radzę sobie z tym ogólną przyczyną i buduję dla tego funkcję:
źródło