• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

algorytm do porownania tablic javascript, nodejs

Object Storage Arubacloud
0 głosów
280 wizyt
pytanie zadane 3 lipca 2020 w JavaScript przez icytower Bywalec (2,110 p.)

hej potrzebuję porównać dwie tablice jedna z nich to tablica z wartościami liczbowymi, druga to tablica obiektów, którą otrzymałem z bazy danych.

const array1 = [1,2,3,4,5];
const array2 = [
{ id: 1},
{ id: 2},
{ id: 3},
{ id: 4},
]

w każdym obiekcie są też jakieś inne dane, jednak są zupełnie bez znaczenia przy tej operacji. wynikiem mają być wartości z array1, których nie ma w array2. jedyne co mi przychodzi do głowy to pętla w pętli, jednak pytanie czy istnieje jakiś prostszy, bardziej wydajny sposób.

ewentualnie czy da się uzyskać taką informację dając zapytanie do bazy danych(sequelize, mysql), żeby baza jeżeli nie znajdzie wszystkiego to zwracała czego nie znalazła.

zapytanie do bazy danych wygląda tak:

const findPost = await Posts.findAll({
          include: [PostCategory],
          where: {
            id: postsId,
            public: true,
          },
        });

 

2 odpowiedzi

0 głosów
odpowiedź 3 lipca 2020 przez Paweł Nąckiewicz Nałogowiec (48,990 p.)
edycja 3 lipca 2020 przez Paweł Nąckiewicz

1. Stwórz nowa tablice do której wpiszesz wartości obiektów z array2. Wyłapiesz to za pomoca Object.keys

2. Za pomoc filtra zwróc te elementy z nowej tablicy, ktorych nie ma w array1.

 

Btw jak masz tak prosta strukture to może nawet 1. punkt ominiesz object.values

0 głosów
odpowiedź 3 lipca 2020 przez Comandeer Guru (600,730 p.)

Widzę tutaj zastosowanie dla połączenia map + filter:

  1. Przejeżdżasz map przez array2 i tworzysz tablicę zawierającą same wartości id.
  2. Zapuszczasz filter na array1 i szukasz wartości, których nie ma w array2 (przy pomocy includes).

W sumie na upartego można to machnąć jednym reduce na array2 (hint: wartością początkową niech będzie array1).

komentarz 3 lipca 2020 przez icytower Bywalec (2,110 p.)
no właśnie myślałem o takim czymś i pytanie dotyczyło czy da się jakoś na jednej pętli lub podczas zapytania do bazy danych. z tym reduce pokombinuję, dzięki.
komentarz 3 lipca 2020 przez Tomek Sochacki Ekspert (227,510 p.)
reduce to nie jest moim zdaniem najlepszy kierunek... rozwiązanie z map i filter jest wg mnie łatwiejsze w analizie i czytelniejsze, szczególnie dla innych osób które w przyszłości będą być może coś robiły z tym kodem.
komentarz 3 lipca 2020 przez ScriptyChris Mędrzec (190,190 p.)

Co w reduce jest mniej czytelnego, jeśli callback do niego przekazany będzie zawierać praktycznie te same warunki co przy zastosowaniu filter?

komentarz 3 lipca 2020 przez Comandeer Guru (600,730 p.)
Bo w jego wnętrzu będą działy się dwie osobne rzeczy: mapowanie i filtrowanie. A to powoduje spory narzut kognitywistyczny. Polecam ten wątek na twitterze w tym temacie: https://twitter.com/jaffathecake/status/1213077702300852224
komentarz 6 lipca 2020 przez icytower Bywalec (2,110 p.)
const findedRecords = array1.reduce((acc, cur) => {
              acc.push(cur.id);
              return acc;
            }, []);

zrobiłem to w ten sposób i mam tablicę ze znalezionymi rekordami. ją wysyłam na front. wtedy front może resztę już sam obsłużyć.

komentarz 6 lipca 2020 przez Comandeer Guru (600,730 p.)

Akurat to można o wiele prościej zapisać jako po prostu map:

const foundRecords = array1.map( ( { id } ) => {
	return id;
} );

 

Podobne pytania

+1 głos
0 odpowiedzi 112 wizyt
pytanie zadane 15 lutego 2021 w JavaScript przez Bartx Bywalec (2,120 p.)
0 głosów
0 odpowiedzi 156 wizyt
0 głosów
2 odpowiedzi 95 wizyt
pytanie zadane 24 maja 2020 w JavaScript przez Allen Obywatel (1,010 p.)

92,546 zapytań

141,387 odpowiedzi

319,503 komentarzy

61,930 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...