Sobes.tech
Junior

Jak porównać obiekty w JavaScript?

sobes.tech AI

Odpowiedź od AI

W JavaScript porównanie bezpośrednie obiektów za pomocą === lub == sprawdza tożsamość referencji, a nie równość ich zawartości. Aby porównać obiekty pod kątem zawartości, można zastosować następujące podejścia:

  • Porównanie powierzchniowe:

    • Sprawdza, czy klucze i wartości są zgodne na pierwszym poziomie zagnieżdżenia.
    • Dotyczy "płaskich" obiektów bez zagnieżdżonych obiektów lub tablic.
    • Można zaimplementować ręcznie, iterując po kluczach lub używając Object.keys() i every().
    // Przykład porównania powierzchniowego
    const czyRownePowierzchniowo = (obj1, obj2) => {
      const klucze1 = Object.keys(obj1);
      const klucze2 = Object.keys(obj2);
    
      if (klucze1.length !== klucze2.length) {
        return false;
      }
    
      for (let klucz of klucze1) {
        if (obj1[klucz] !== obj2[klucz]) {
          return false;
        }
      }
    
      return true;
    };
    
  • Porównanie głębokie:

    • Rekurencyjnie sprawdza wszystkie poziomy zagnieżdżenia obiektów i tablic.
    • Jest konieczne do poprawnego porównania złożonych struktur danych.
    • Może używać rekurencji lub podejścia iteracyjnego z użyciem stosu.
    • Wymaga obsługi różnych typów danych (prymitywy, obiekty, tablice, daty, wyrażenia regularne).
  • Porównanie z użyciem JSON.stringify():

    • Konwertuje obiekty na łańcuchy JSON i porównuje te łańcuchy.
    • Prosty sposób, ale z ograniczeniami:
      • Nie uwzględnia kolejności kluczy w obiektach.
      • Nie obsługuje funkcji, undefined, NaN, Infinity.
      • Może być nieefektywny dla bardzo dużych obiektów.
    // Przykład porównania przez JSON.stringify
    const czyRowneJSON = (obj1, obj2) => {
      return JSON.stringify(obj1) === JSON.stringify(obj2);
    };
    
  • Użycie bibliotek zewnętrznych:

    • Biblioteki takie jak lodash (funkcja _.isEqual) lub deep-equal zapewniają niezawodne i zoptymalizowane implementacje głębokiego porównania, uwzględniające wiele niuansów (odwołania cykliczne, różne typy, przypadki brzegowe).

Wybór metody zależy od wymaganego poziomu dokładności i złożoności porównywanych obiektów. Dla prostych przypadków wystarczy porównanie powierzchniowe lub JSON.stringify(). Dla złożonych struktur zaleca się użycie głębokiego porównania lub gotowych bibliotek.