praca na dwóch tablicach, zagnieżdzenie, map i find - poprawa kodu

0

Zadaniem funkcji jest sprawdzenie czy gracz z tablicy naszych kontaktów znajduje się w tablicy graczy online. Jeżeli tak to aktualizujemy kontakt: przypisujemy aktualny level i profesje oraz ustawiamy status: "Online". W tej chwili funkcja wykonuje zamierzony efekt ale wiem, że z pewnością wymaga zmian aby była czytelniejsza. Np. mam problem, że kiedy po instrukcji:

if (contactOnline.name === contact.name)

dodam:

else {
        contact.status = "Offline";
      }

To wtedy status będzie na Offline... a nie powinień.

Jeszcze małe pytanie, jaki błąd jest w takim przypisaniu?

contact = {...contactOnline, status: "Online"};

Kod funkcji:

app.get("/contact-list", async (req, res) => {
  const { contactlist } = req.cookies;
  const tibiantisPlayersList = await getPlayersOnline();

  contactlist.map((contact) => {
    contact.status = "Offline";

    return tibiantisPlayersList.find((contactOnline) => {
      if (contactOnline.name === contact.name) {
        contact.vocation = contactOnline.vocation;
        contact.level = contactOnline.level;
        contact.status = "Online";
      }
    });
  });

  res.cookie("contactlist", contactlist, { maxAge: 24 * 60 * 60 * 1000 });
  res.render("contactlist", { contactlist: contactlist });
});
2

To, że to w jakikolwiek sposób działa, to jest cud :)

Co w praktyce tutaj robisz, to coś takiego:

contactlist.forEach((contact) => {
    contact.status = "Offline";

    tibiantisPlayersList.forEach((contactOnline) => {
      if (contactOnline.name === contact.name) {
        contact.vocation = contactOnline.vocation;
        contact.level = contactOnline.level;
        contact.status = "Online";
      }
    });
  });

Metoda map służy do tworzenia nowych tablic, a nie modyfikacji istniejących, ale że i tak nie przechwyciłeś tej nowej tablicy, którą stworzyłeś to na jedno wyszło.
Metoda find nic tutaj nie znalazła, bo funkcja wewnątrz jej cały czas zwracała undefined. Czyli po prostu iterowała po wszystkich możliwych elementach i modyfikowała ich zawartość.

A czego ty potrzebujesz, to raczej coś takiego:

contactlist.forEach((contact) => {
    const match = tibiantisPlayersList.find((contactOnline) => contactOnline.name === contact.name);
    if (match) {
      contact.vocation = match.vocation;
      contact.level = match.level;
      contact.status = "Online";
    } else {
      contact.status = "Offline";
    }
  });
0

Pojawia się error:

contact.vocation = contactOnline.vocation;     
                         ^
ReferenceError: contactOnline is not defined

edit:
zrobiłem tak:

contactlist.forEach((contact) => {
    contact.status = "Offline";

    tibiantisPlayersList.find((contactOnline) => {
      if (contactOnline.name === contact.name) {
        contact.vocation = contactOnline.vocation;
        contact.level = contactOnline.level;
        contact.status = "Online";
      }
    });
  });

Ale nie wiem dlaczego else nie działa....

1

Ja się walnąłem, nie to skopiowałem. Powinno być:

contactlist.forEach((contact) => {
    const match = tibiantisPlayersList.find((contactOnline) => contactOnline.name === contact.name);
    if (match) {
      contact.vocation = match.vocation;
      contact.level = match.level;
      contact.status = "Online";
    } else {
      contact.status = "Offline";
    }
  });
0

o dzięki :P
a jeszcze jedno pytanie:

contact = {...contactOnline, status: "Online"};

czy da się to poprawić żeby działało? W sensie skrócić zapis

1

Możesz tak zrobić:


app.get("/contact-list", async (req, res) => {
  const { contactlist } = req.cookies;
  const tibiantisPlayersList = await getPlayersOnline();

 const updatedContactlist = contactlist.map((contact) => {
    const match = tibiantisPlayersList.find((contactOnline) => contactOnline.name === contact.name);
    if (match) return { ...match, status: "Online" }
    return { ...contact, status: "Offline" }
});

  res.cookie("contactlist", updatedContactlist, { maxAge: 24 * 60 * 60 * 1000 });
  res.render("contactlist", { contactlist:  updatedContactlist });
});

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