Sortowanie tablicy obiektow

Sortowanie tablicy obiektow
KR
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad rok
  • Postów:15
0

Witam, przegladalem W3schools dla JS i znalazlem dobry przyklad na sortowanie tablic obiektow ( https://www.w3schools.com/js/js_array_sort.asp )
var cars = [
{type:"Volvo", year:2016},
{type:"Saab", year:2001},
{type:"BMW", year:2010}
];
wiem jak posortowac po type, lub po year ale brakuje mi sortowania po obu w przypadku wiekszej ilosci elementow.
Jak powinien wygladac kod (lub funkcja compare) zeby posortowac:
var cars = [
{type:"Volvo", year:2016},
{type:"Saab", year:2001},
{type:"BMW", year:2010},
{type:"Volvo", year:2008},
{type:"Saab", year:2011},
{type:"BMW", year:2002}
];
najpierw po typie a potem po year, aby wynik byl nastepujacy:
{type:"BMW", year:2002},
{type:"BMW", year:2010},
{type:"Saab", year:2001},
{type:"Saab", year:2011},
{type:"Volvo", year:2008},
{type:"Volvo", year:2016}

Dzieki

MA
  • Rejestracja:prawie 17 lat
  • Ostatnio:10 dni
  • Postów:644
2

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

Kopiuj
If compareFunction(a, b) returns less than 0, sort a to an index lower than b (i.e. a comes first).
If compareFunction(a, b) returns 0, leave a and b unchanged with respect to each other, but sorted with respect to all different elements. Note: the ECMAscript standard does not guarantee this behavior, thus, not all browsers (e.g. Mozilla versions dating back to at least 2003) respect this.
If compareFunction(a, b) returns greater than 0, sort b to an index lower than a (i.e. b comes first).
compareFunction(a, b) must always return the same value when given a specific pair of elements a and b as its two arguments. If inconsistent results are returned, then the sort order is undefined.

sort może przyjąć argument w postaci funkcji, która to dostaje 2 elementy do porównania, następnie zwracasz 0 jak elementy są równe, mniej niż 0 jak element a ma być wyżej i więcej niż 0 jak element b ma być wyżej.

Z czym dokładnie masz problem?

KR
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad rok
  • Postów:15
0
Markuz napisał(a):

Z czym dokładnie masz problem?

Problem mój polega na tym że w moim przypadku, jeśli sortuje po 1wszym elemencie obiektu i dostaje zwrotkę 0 to funkcja powinna wziąć pod uwagę drugi element obiektu.
Czyli, jeśli element A to {type:"BMW", year:2010} a element B to {type:"BMW", year:2002}, to ponieważ type w obu elementach jest taki sam (dostanę return 0) to funkcja sortująca powinna wziąć pod uwagę year. i ustawić element B przed elementem A. I właśnie nie wiem jak zmusić funkcję sortującą aby ten year wzięła pod uwagę :-)

edytowany 1x, ostatnio: cerrato
MA
  • Rejestracja:prawie 17 lat
  • Ostatnio:10 dni
  • Postów:644
1
edytowany 1x, ostatnio: Markuz
Maciej Cąderek
Maciej Cąderek
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Warszawa
  • Postów:1264
4
Kopiuj
const sorted = cars.sort((a, b) => {
  return a.type.localeCompare(b.type) || a.year - b.year
})

Ten sposób wykorzystuje fakt, że 0 jest falsy - dlatego dla elementów których porównanie zwraca 0 (takie same elementy) będzie wykonane następne wyrażenie. Można tak dodać dowolną ilość porównań o malejącym priorytecie:

Kopiuj
myArray.sort((a, b) =>
  a.foo.localeCompare(b.foo)
  || a.baz - b.baz
  || a.bar.localeCompare(b.bar)
  || a.bat - b.bat
  || a.nes.ted.localeCompare(b.nes.ted)
)

Zamiast localeCompare dla stringów, możesz użyć zwykłego porównania, które porównuje wg kolejności znaków Unicode, np:

Kopiuj
const compareStr = (a, b) => a === b ? 0 : a > b ? 1 : -1
Kopiuj
myArray.sort((a, b) =>
  compareStr(a.foo, b.foo)
  || a.baz - b.baz
  || compareStr(a.bar, b.bar)
  || a.bat - b.bat
  || compareStr(a.nes.ted, b.nes.ted)
)
edytowany 5x, ostatnio: Maciej Cąderek
KR
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad rok
  • Postów:15
0

zaimplementowałem, działa :D dzięki panowie

mam jeszcze jedno pytanie odnośnie UrlFetchApp.fetch(url).

Czy poniższy kod, w przypadku kiedy response =200 , wysyła zapytanie URL 2x ? (raz dla warunku if i sprawdzenia response a drugi raz dla przypisania body do pola response)
Generalnie całość opakowana jest pętlą for wiec nie dziwcie się poleceniem continue.

Kopiuj
 if(UrlFetchApp.fetch(url).getResponseCode()!=200){
      continue;
    }else{
        var response = UrlFetchApp.fetch(url)
        var data = JSON.parse(response);

Jeśli zapytanie wysłane jest dwukrotnie, można jakoś zrobić aby za jednym wysłaniem sprawdził response code i w zależności czy mam 200 czy inny, albo przeskoczył do kolejnej iteracji albo przypisał response body do zmiennej data ?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.