Sortowanie tablicy obiektow

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

2

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

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?

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ę :-)

4
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:

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:

const compareStr = (a, b) => a === b ? 0 : a > b ? 1 : -1
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)
)
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.

 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 ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1