Czy można posortować i uporządkować tablicę, która wygląda tak:
itemsArray = [
['Anne', 'a'],
['Bob', 'b'],
['Henry', 'b'],
['Andrew', 'd'],
['Jason', 'c'],
['Thomas', 'b']
]
aby dopasować układ tej tablicy:
sortingArr = [ 'b', 'c', 'b', 'b', 'a', 'd' ]
Niestety nie mam żadnych identyfikatorów do śledzenia. Musiałbym nadać priorytet tablicy items, aby dopasować sortingArr tak blisko, jak to możliwe.
Aktualizacja:
Oto wynik, którego szukam:
itemsArray = [
['Bob', 'b'],
['Jason', 'c'],
['Henry', 'b'],
['Thomas', 'b']
['Anne', 'a'],
['Andrew', 'd'],
]
Masz jakiś pomysł, jak można to zrobić?
javascript
user1448892
źródło
źródło
Odpowiedzi:
Coś jak:
Oto krótszy kod, ale niszczy
sorting
tablicę:źródło
Jedna linia odpowiedzi.
źródło
itemsArray
. W zależności od wymagań dotyczących wydajności byłoby to dużo bezpieczniejszeitemsArray.slice().sort(...)
.sortingArr
musi zawierać wszystkie wartości witemsArray
. Rozwiązaniem jest przesunięcie elementów na tył tablicy, jeśli nie istnieją wsortingArr
:allProducts.sort((product1, product2) => { const index1 = manualSort.indexOf(product1.id); const index2 = manualSort.indexOf(product2.id); return ( (index1 > -1 ? index1 : Infinity) - (index2 > -1 ? index2 : Infinity) ); });
Jeśli używasz natywnej funkcji sortowania tablicy, możesz przekazać niestandardowy komparator, który będzie używany podczas sortowania tablicy. Komparator powinien zwrócić liczbę ujemną, jeśli pierwsza wartość jest mniejsza od drugiej, zero, jeśli są równe, i liczbę dodatnią, jeśli pierwsza wartość jest większa.
Więc jeśli dobrze rozumiem przykład, który podajesz, możesz zrobić coś takiego:
źródło
indexOf
zwraca pierwszy indeks.sortingArr
sortingArray
zewnętrzną stronę funkcji, aby uniknąć ponownego deklarowania jej przy każdej iteracji sortowaniaPrzypadek 1: Pytanie oryginalne (brak bibliotek)
Wiele innych odpowiedzi, które działają. :)
Przypadek 2: Oryginalne pytanie (Lodash.js lub Underscore.js)
Przypadek 3: Sortuj Array1 tak, jakby to był Array2
Zgaduję, że większość ludzi przyszła tutaj, szukając odpowiednika dla PHP's array_multisort (tak zrobiłem), więc pomyślałem, że również opublikuję tę odpowiedź. Jest kilka opcji:
1. Istnieje już implementacja funkcji array_multisort () w JS . Dzięki @Adnan za wskazanie tego w komentarzach. Jest jednak dość duży.
2. Napisz własną. ( Demo JSFiddle )
3. Lodash.js lub Underscore.js (obie popularne, mniejsze biblioteki, które koncentrują się na wydajności) oferują funkcje pomocnicze, które pozwalają to zrobić:
... co spowoduje (1) pogrupowanie tablicy sortArray w
[index, value]
pary, (2) posortuje je według wartości (można tu również podać wywołanie zwrotne), (3) zastąpi każdą z par elementem z tablicy itemArray w indeksie para pochodzi z.źródło
to prawdopodobnie za późno, ale możesz również użyć zmodyfikowanej wersji kodu poniżej w stylu ES6. Ten kod dotyczy tablic takich jak:
Faktyczna operacja:
Rzeczywista operacja w ES5:
Powinno skutkować
arrayToBeSorted = [3,5]
Nie niszczy tablicy referencyjnej.
źródło
[{name: "1"}, {name: "2"}, {name: "3"}, ...]
.Użyłbym obiektu pośredniego (
itemsMap
), unikając w ten sposób złożoności kwadratowej:Zobacz http://jsfiddle.net/eUskE/
źródło
http://jsfiddle.net/s7b2P/
Kolejność wynikowa: Bob, Jason, Henry, Thomas, Anne, Andrew
źródło
Dlaczego nie coś takiego
Funkcja mapy może nie być dostępna we wszystkich wersjach
Javascript
źródło
źródło
Oto, czego szukałem i zrobiłem, aby posortować tablicę tablic na podstawie innej tablicy:
źródło
Musiałem to zrobić dla ładunku JSON otrzymanego z interfejsu API, ale nie było to w kolejności, w której chciałem.
Tablica jako tablica referencyjna, taka, według której ma być sortowana druga tablica:
Zrobiłem to jako obiekty, ponieważ te ostatecznie będą miały inne właściwości.
Utworzona tablica:
Używane z zestawem wyników z bazy danych. Nie wiem, jak wydajna jest, ale przy kilku kolumnach, których użyłem, działała dobrze.
źródło
Aby uzyskać nową uporządkowaną tablicę, możesz wziąć
Map
i zebrać wszystkie elementy z poszukiwanym kluczem w tablicy i zmapować żądane uporządkowane klucze, biorąc przesiany element z poszukiwanej grupy.źródło
{}
zamiastMap
🤷♂️To rozwiązanie doda obiekty na końcu, jeśli klucz sortowania nie jest obecny w tablicy referencyjnej
źródło
to powinno działać:
źródło
Możesz spróbować tej metody.
źródło
ES6
Więcej przykładów z różnymi tablicami wejściowymi
źródło
W przypadku, gdy musisz to zrobić z tablicą obiektów, oto adaptacja niesamowitej odpowiedzi @Durgpal Singha:
źródło
Użyj metody $ .inArray () z jQuery. Możesz wtedy zrobić coś takiego
źródło
Użyj przecięcia dwóch tablic.
Dawny:
=> ['a', 'b', 'e']
jeśli „z” i „s” są poza zakresem pierwszej tablicy, dołącz je na końcu wyniku
źródło
Możesz zrobić coś takiego:
Możesz to przetestować tutaj .
Uwaga: zakłada się, że przekazywane przez Ciebie tablice mają równoważny rozmiar. Jeśli tak nie jest, musisz dodać dodatkowe kontrole.
patrz odnośnik
odnosić się
źródło