Mam tablicę wielowymiarową. Podstawowa tablica to tablica
[publicationID][publication_name][ownderID][owner_name]
To, co próbuję zrobić, to posortować tablicę według, owner_name
a następnie według publication_name
. Wiem, że w JavaScript masz Array.sort()
, do którego możesz wstawić niestandardową funkcję, w moim przypadku mam:
function mysortfunction(a, b) {
var x = a[3].toLowerCase();
var y = b[3].toLowerCase();
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}
Jest to dobre rozwiązanie dla właśnie sortowania w kolumnie pierwszej, mianowicie owner_name, ale jak mam go zmodyfikować, aby posortować owner_name
, a następnie publication_name
?
javascript
algorithm
sorting
aromat404
źródło
źródło
[[A, 10], [J, 15], [A, 5], [J, 5]] => [[A, 10], [A, 5], [J, 15], [J, 5]]
Myślę, że to, czego szukasz, to thenBy.js: https://github.com/Teun/thenBy.js
Pozwala na użycie standardowego Array.sort, ale w dobrym
firstBy().thenBy().thenBy()
stylu.Przykład można zobaczyć tutaj .
źródło
thenBy
jest wywoływana, wszystkie elementy tablicy są ponownie przepuszczane.Dobrym sposobem sortowania według wielu pól, które są łańcuchami, jest użycie
toLocaleCompare
i operatora boolowskiego||
.Coś jak:
Jeśli chcesz posortować według większej liczby pól, możesz po prostu połączyć je z instrukcją return za pomocą większej liczby operatorów logicznych.
źródło
.reduce()
.localCompare()
zwraca -1, 0, 1, więc nie sądzę, aby twoje rozwiązanie zadziałało jak || jest dobre dlasortItems = (a, b) => (a.distance - b.distance) || (a.name - b.name);
i działa jak urok dla moich nie wybrednych potrzeb.(a.name - b.name)
chyba że jest to konieczne. Tworzenie zmiennych najpierw wymaga dodatkowej pracy, nawet jeśli nie jest potrzebne.Pojawiła się potrzeba wykonania mieszanego sortowania obiektów asc i desc w stylu SQL według kluczy.
Rozwiązanie kennebeca powyżej pomogło mi w osiągnięciu tego:
przykładowe użycie:
daje:
(używając funkcji drukowania stąd )
oto przykład jsbin .
edycja: oczyszczono i opublikowano jako mksort.js na github .
źródło
Jest to przydatne w przypadku typów alfa wszystkich rozmiarów. Przekaż mu indeksy, według których chcesz sortować, w kolejności, jako argumenty.
źródło
Proponuję użyć wbudowanej funkcji porównującej i połączyć pożądany porządek sortowania za pomocą logicznego lub
||
.Przykład pracy:
źródło
Możesz połączyć dwie zmienne razem w klucz sortowania i użyć go do porównania.
źródło
Znalazłem multisotr . Jest to prosta, wydajna i mała biblioteka do wielokrotnego sortowania. Musiałem posortować tablicę obiektów z kryteriami sortowania dynamiki:
Ta biblioteka jest potężniejsza, tak było w moim przypadku. Spróbuj.
źródło
Pracowałem z
ng-grid
i musiałem posortować wiele kolumn na tablicy rekordów zwróconych z interfejsu API, więc wymyśliłem tę sprytną, dynamiczną funkcję wielokrotnego sortowania.Przede wszystkim
ng-grid
uruchamia „zdarzenie” dla „ngGridSorted” i przekazuje tę strukturę z powrotem, opisując sortowanie:Zbudowałem więc funkcję, która będzie dynamicznie generować funkcję sortowania w oparciu o to,
sortData
co pokazano powyżej ( Nie bój się paska przewijania! Ma tylko około 50 wierszy! Przepraszam za błąd. Zapobiegało to poziomemu pasek przewijania! ):Następnie sortuję wyniki mojego interfejsu API (
results
) w następujący sposób:Mam nadzieję, że komuś spodoba się to rozwiązanie tak samo jak ja! Dzięki!
źródło
Spróbuj tego:
Pokaż fragment kodu
Zakładam, że twoje dane są w tablicy,
let t = [ [publicationID, publication_name, ownderID, owner_name ], ... ]
gdzie indeks nazwa_właściciela = 3 i nazwa_publikacji = 1.źródło
Metoda dołączania ciągów
Możesz sortować według wielu wartości, po prostu dołączając wartości do ciągu i porównując ciągi. Pomocne jest dodanie znaku podziału klucza, aby zapobiec przechodzeniu z jednego klucza do drugiego.
Przykład
źródło
źródło
Miałem podobny problem podczas wyświetlania bloków puli pamięci z wyjścia jakiejś wirtualnej kompozycji h-funkcji DOM. Zasadniczo miałem ten sam problem, co przy sortowaniu danych wielokryterialnych, takich jak wyniki punktacji graczy z całego świata.
Zauważyłem, że sortowanie wielokryterialne to:
A jeśli cię to nie obchodzi, możesz szybko ponieść klęskę w piekle, w którym zagnieżdżono, jeśli inaczej ... jak piekło obietnic oddzwonienia ...
A co jeśli napiszemy funkcję „predykatu”, aby zdecydować, której części alternatywy używamy? Predykat to po prostu:
Teraz po napisaniu testów klasyfikujących (byCountrySize, byAge, byGameType, byScore, byLevel ...) cokolwiek potrzebujesz, możesz zważyć swoje testy (1 = rosnąco, -1 = desc, 0 = wyłączone), umieścić je w tablicy i zastosuj redukcyjną funkcję „zdecyduj”, taką jak ta:
I voila! Do Ciebie należy określenie własnych kryteriów / wag / zamówień ... ale masz pomysł. Mam nadzieję że to pomoże !
EDYCJA: * upewnij się, że w każdej kolumnie istnieje całkowity porządek sortowania * pamiętaj o braku zależności między kolejnością kolumn i żadnych zależności cyklicznych
jeśli nie, sortowanie może być niestabilne!
źródło
Moja własna biblioteka do pracy z iterable ES6 (blinq) umożliwia (między innymi) łatwe wielopoziomowe sortowanie
źródło
Pochodzi z GitHub
źródło
Właśnie opublikowałem dla npm mikro-bibliotekę o nazwie sort-helper ( źródło na github ) . Chodzi o to, aby zaimportować pomocnika w
by
celu utworzenia funkcji porównującej dlasort
metody tablicowej za pomocą składniitems.sort(by(column, ...otherColumns))
, z kilkoma sposobami wyrażenia kolumn do sortowania według:persons.sort(by('lastName', 'firstName'))
,dates.sort(by(x => x.toISOString()))
,[3, 2, 4, 1].sort(by(desc(n => n)))
→[3, 2, 1, 0]
,['B', 'D', 'c', 'a'].sort(by(ignoreCase(x => x))).join('')
→'aBcD'
.Jest podobny do miłego thenBy wspomnianego w tej odpowiedzi, ale z następującymi różnicami, które mogą być bardziej w gust niektórych:
thenBy
płynne API) ,źródło