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

Porównywanie obiektów JS

VPS Starter Arubacloud
0 głosów
1,797 wizyt
pytanie zadane 2 lipca 2018 w JavaScript przez SandraS Obywatel (1,400 p.)

Hej :)
Jeżeli chcę porównywać referencję obiektów to muszę użyć JSON.stringify. Dlaczego? Nie powinno być tak, że jeżeli porównuję dwie różne referencje o tych samych wartościach to powinno wypisać mi true, a dopiero przy próbie sprawdzenia, czy są identyczne powinno wypisać mi false bo pochodzą z innych lokalizacji?

Co daje tem JSON.stringify? Spłaszcza? Zwraca po prostu czystą wartość (string), dlatego wtedy idzie porównać referencje?

var tablica_1 = ['1', '2', '3'];
var tablica_2 = ['1', '2', '3'];
var referencja_tablicy_1 = tablica_1;
var referencja_tablicy_2 = tablica_2;

console.log('tablica_1', tablica_1);                          //wypisze ["1", "2", "3"]
console.log('tablica_2', tablica_2);                          //wypisze ["1", "2", "3"]
console.log('referencja_tablicy_1', referencja_tablicy_1);    //wypisze ["1", "2", "3"]
console.log('referencja_tablicy_2', referencja_tablicy_2);    //wypisze ["1", "2", "3"]

console.log('czy referencja_tablicy_1 == referencja_tablicy_2?', referencja_tablicy_1 == referencja_tablicy_2);         //wypisze false
console.log('czy referencja_tablicy_1 === referencja_tablicy_2?', referencja_tablicy_1 === referencja_tablicy_2);       //wypisze false

console.log('czy referencja_tablicy_1 JSON == referencja_tablicy_2 JSON?', JSON.stringify(referencja_tablicy_1) == JSON.stringify(referencja_tablicy_2));       //wypisze true
console.log('czy referencja_tablicy_1 JSON === referencja_tablicy_2 JSON?', JSON.stringify(referencja_tablicy_1) === JSON.stringify(referencja_tablicy_2));     //wypisze true

 

1 odpowiedź

+1 głos
odpowiedź 2 lipca 2018 przez Comandeer Guru (604,880 p.)

Obiekty nie są porównywane według wartości, jak typy prymitywne, ale wg tożsamości. Dlatego obiekt jest równy tylko samemu sobie, bo każdy ma inną tożsamość.

Zamiast JSON.stringify użyłbym raczej Object.entries a następnie przelatywał pętlą te tablice i sprawdzał, czy są takie same.

komentarz 6 grudnia 2018 przez Kiszuriwalilibori Nowicjusz (100 p.)
Jestem dość świeży w temacie ale przy porównywaniu wartości JSON.stringify zadziała niekiedy lepiej niż Object.entries  (a na pewno prościej) niezależnie od zawartości obiektów.

Przerabiam właśnie temat związany z React.js a konkretnie shouldComponentRender. Otóż jeżeli w wartościach obiektów znajdą sie funkcje (w moim wypadku handlery zdarzeń), metoda z pętlą wywali bezwarunkowo false, natomiast JSON.stringify da dokładnie to czego oczekuję.
komentarz 6 grudnia 2018 przez Comandeer Guru (604,880 p.)

JSON.stringify nie poradzi sobie z rekursywnymi obiektami (takimi jak węzły DOM).

Niemniej w Twoim przypadku chyba chodzi o instancję klasy? Tutaj pewnie rozchodzi się o to, że jest inne this przypięte.

Podobne pytania

0 głosów
1 odpowiedź 1,448 wizyt
pytanie zadane 12 listopada 2016 w JavaScript przez ReksetoDev Gaduła (4,530 p.)
0 głosów
1 odpowiedź 347 wizyt
0 głosów
1 odpowiedź 348 wizyt

93,006 zapytań

141,972 odpowiedzi

321,254 komentarzy

62,345 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...