sortowanie listy graczy, którzy mają status online

0

cześć mam tablicę z obiektami, które przedstawiają graczy (..pewnej gry w której nie widać nieba), przykład obiektu:

 {
      id: uuid(),
      name: "Jakis Gracz",
      vocation: "knight",
      level: 50,
      status: "Online",
    };

Zrobiłem już sortowanie alfabetycznie i wg. levelu. Teraz chciałbym po statusie. I tu się zastanawiam czy można użyć funkcji sort czy po prostu zrobić kopię tablicy i zrobić na każdej filtrowanie Online lub Offline, a potem obydwie tablice połączyć. Zastanawiam się czy można w inny sposób.

I jeszcze delikatnie po za pytaniem, może rzucić okiem na te dwie funkcje do sortowania? Można coś w nich poprawić?

app.get("/sort-by-name", (req, res) => {
  const { contactlist } = req.cookies;
  contactlist.sort((a, b) => {
    if (a.name < b.name) {
      return -1;
    }
    if (a.name > b.name) {
      return 1;
    }

    return 0;
  });

  res.cookie("contactlist", contactlist, { maxAge: WEEK });
  res.redirect("/contact-list");
});

app.get("/sort-by-level", (req, res) => {
  const { contactlist } = req.cookies;

  contactlist.sort((a, b) => b.level - a.level);

  res.cookie("contactlist", contactlist, { maxAge: WEEK });
  res.redirect("/contact-list");
});
1

Do sortowania możesz użyć tej samej funkcji:

let attr = 'name';
list.sort((a, b) => (a.attr > b.attr) - (a.attr < b.attr));
let attr = 'level';
list.sort((a, b) => (a.attr > b.attr) - (a.attr < b.attr));
0
list.sort((a, b) => (a.attr > b.attr) - (a.attr < b.attr));

Tutaj mam mały problem, bo sortuje mi tak, np: 109, 129, 180, 49, 52, 60

0

to albo attr nie podmieniłeś na właściwą nazwę, albo wartości nie są typu number tylko stringami, musisz najpierw zamienić na liczbę, albo po prostu zrobić a.attr - b.attr - odejmowanie wymusi zamianę na liczbę ale nie zadziała na stringi

w przykładzie Haskella żeby zadziałało z podawaniem attr przez nazwę musiałbyś zamienić a.attr na a[attr]

Jeśli chcesz połączyć sortowania, najpierw po a, potem po b to możesz użyć właściwości alternatywy logicznej "||" że w razie równych obiektów (0) zostanie zwrócony wynik drugiego wyrażenia:

list.sort((a, b) =>
  -a.status.localeCompare(b.status) || // najpierw po statusie (minus po to żeby Online były przed Offline (n > f), możesz też zamienić `a` z `b`
  (a.level - b.level) || // potem po levelu
  a.vocation.localeCompare(b.vocation) // potem po klasie
);

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