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()ievery().
// 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) lubdeep-equalzapewniają niezawodne i zoptymalizowane implementacje głębokiego porównania, uwzględniające wiele niuansów (odwołania cykliczne, różne typy, przypadki brzegowe).
- Biblioteki takie jak
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.