JavaScript: Jak usunąć duplikaty z tablicy?

Opublikowano: - tagi:

Jest kilka sposobów na rozwiązanie tego problemu. Tutaj podaję jeden z nich:

const data = [1, 2, 3, 1, 7, 7, 5, 1, 8, 9];

const removeDuplicates = (someData) => {
  return Array.from(new Set(someData));
};

console.log('data: ', removeDuplicates(data)); // [1, 2, 3, 7, 5, 8, 9]

Najpierw przekazujemy tablicę do klasy Set dzięki, której pozbędziemy się duplikatów. Na koniec przy użyciu metody from z klasy Array zamieniamy obiekt Set w tablicę.


RxJS: Operator pluck

Opublikowano: - tagi:

Operator pluck działa bardzo podobnie do opisanego operatora map.

Jeśli potrzebujemy wyłuskać dane z jednej właściwości, ten operator idealnie się do tego nadaje.

Przykłady

Przykład 1

import { from } from 'rxjs';
import { pluck } from 'rxjs/operators';

const data = [
    {
        title: 'Foo',
        value: 1
    },
    {
        title: 'Bar',
        value: 2
    }
];

const observable = from(data).pipe(
    pluck('title')
);
observable.subscribe(console.log);
// Wynik
// Foo
// Bar

Przykład 2

Za pomocą operatora pluck możemy też pobrać zagnieżdżone wartości:

import { from } from 'rxjs';
import { pluck } from 'rxjs/operators';

const data = [
    {
        title: 'Foo',
        value: {
            amount: 100,
            currency: 'PLN'
        }
    },
    {
        title: 'Bar',
        value: {
            amount: 700,
            currency: 'EUR'
        }
    }
];

const observable = from(data).pipe(
    pluck('value', 'currency')
);
observable.subscribe(console.log);
// Wynik
// PLN
// EUR

NodeJS: Mongoose jak sprawdzić czy podano tablicę w modelu danych?

Opublikowano: - tagi:

W jednym z poprzednich wpisów pisałem o walidacji danych w bibliotece Mongoose.

Dzisiaj opiszę konkretny przypadek: jak sprawdzić, czy przekazano do modelu tablicę, która jest wymagana?

Sprawdzanie tablicy

Załóżmy, że mam taki model danych:

const PostSchema = new Schema({
title: { type: String, required: true },
tags: { type: [String], required: true }
});
const PostModel = mongoose.model('post', PostSchema);

Definiujemy model danych, w którym mamy dwa parametry: title i tags. Oba są wymagane. Przy czym title to zwykły ciąg znaków, a tags to zwykła tablica tekstowa.

Poniżej znajduje się fragment kodu, który sprawdza poprawność danych w modelu i próbuje dodać nowy rekord do bazy danych:

const newEntry = PostModel({ title: 'Some entry' });

const validateErrors = newEntry.validateSync(); 
console.log('validateErrors: ', validateErrors);

try {
  await PostModel.create(newEntry);
} catch(error) {
  console.log('error: ', error);
}

Pytanie: czy metoda validateSync powinna zwrócić jakieś błędy/błąd walidacji? Czy wszystko tutaj jest ok? Do modelu przekazujemy jedno pole: title, które jest wymagane. Nie przekazaliśmy jednak pola: tags, które także jest wymagane. Więc odpowiedź jest prosta! Zwróci błąd walidacji!

To nieprawda. Rekord zostanie dodany do bazy.

Jak to możliwe?

Walidacja wymaganej tablicy

Żeby dowiedzieć się, co się stało, sprawdźmy zawartość bazy danych. Okazuje się, że pole tags to pusta tablica!

Jeśli w modelu danych zdefiniowaliśmy typ tablica i przy tworzeniu rekordu pominiemy to pole, w takim przypadku zostanie umieszczona pusta tablica.

A co zrobić jeśli chcemy jednak wymagać podania tablicy? Prosta rzecz:

...
tags: { type: [String], required: true, default: undefined }

Definiujemy dodatkowe pole: default i ustawiamy je na undefined. Po tej zmianie zostanie zgłoszony błąd walidacji, a rekord nie zostanie dodany do bazy danych.


Blog: Podsumowanie po roku

Opublikowano: - tagi:

Dokładnie 1 kwietnia 2021 uruchomiłem swojego bloga. Z perspektywy czasu uważam, że to był dobry ruch z mojej strony.

Poniżej krótkie podsumowanie:

Regularność

Przed startem założyłem sobie, że będę publikować wpis minimum raz na tydzień. I to mi się udało! Nie twierdzę, że było łatwo. Czasami były momentu zastoju, ale udało mi się to pokonać.

Przed uruchomieniem bloga chciałem uniknąć sytuacji, że po chwili entuzjazmu zapał będzie z czasem maleć. Dzięki prowadzeniu bloga udało mi się zbudować dyscyplinę.

Rozwój

Jednym ze spiritus movens prowadzenie własnego bloga jest zdobywanie nowych umiejętności. Sprawa jest prosta: uczę się czegoś nowego i opisuję to na blogu.

Chcę rozwijać się także, w pisaniu. Wiem, że przede mną długa droga, ale uczenie się nowych rzeczy sprawia mi przyjemność.

W czerwcu dodałem nowy dział: komiksy. Nie potrafię rysować, ale staram się pracować nad swoją kreatywnością poprzez rysowanie zabawnych sytuacji.

Notatnik

Ludzie tworzą blogi z różnych powodów: jedni, bo chcą dzielić się wiedzą inni, żeby zarabiać pieniądze. Ja złapałem się na tym, że sam od czasu do czasu korzystam z własnego bloga!

Spisuję tu różne rzeczy, które są mi przydatne takie jak na przykład: praca z komiksy lub przeczytane książki.


Podsumowanie: Marzec 2022

Opublikowano: - tagi:

W marcu opublikowałem 8 wpisów:

Inne:

  1. Jak zbudować dyscyplinę

JavaScript:

  1. NodeJS: Mongoose walidacja danych modelu
  2. Angular: Jak zintegrować frontend i backend za pomocą proxy?
  3. RxJS: Operator from
  4. Jak sprawdzić czy obiekt jest pusty?
  5. RxJS: Operator map

Webstorm:

  1. Podgląd ostatnio edytowanych lub otwartych plików

Opublikowałem także jeden komiks:

  1. It is not a bug, it is a feature!

Przeczytałem trzy książki:

  1. Dzisiaj narysujemy śmierć - Wojciech Tochman
  2. Król - Szczepan Twardoch
  3. Normalni ludzie - Sally Rooney

Przesłuchałem trzy audiobooki:

  1. Sapiens. Od zwierząt do bogów - Yuval Noah Harari
  2. Smartcuts - Shane Snow
  3. Klara i słońce - Kazuo Ishiguro