Czy w Angular można zrobić „głębokie” porównanie dwóch obiektów? Chciałbym porównać każdą parę klucz / wartość. Na przykład:
Przedmiot 1
{
key1: "value1",
key2: "value2",
key3: "value3"
}
Obiekt 2
{
key1: "value1",
key2: "newvalue",
key3: "value3"
}
To, czego potrzebuję, to niepowodzenie porównania, ponieważ tylko jedna z par klucz / wartość jest różna. Innymi słowy, WSZYSTKIE pary klucz / wartość muszą dokładnie pasować, w przeciwnym razie wystąpi błąd. Czy to jest już wbudowane w Angular? Jestem pewien, że mógłbym napisać własny serwis, gdybym naprawdę tego potrzebował, ale miałem nadzieję, że został już wbudowany. Podobnie jak angular.equals.
angular.equals( { id: "12" }, { id: 12 } ) // is false
false
ponieważ na podstawie tożsamości"12"===12 // is false
. Po prostu to wypróbuj.Zakładając, że kolejność jest taka sama w obu obiektach, po prostu
stringify
je oba i porównaj!JSON.stringify(obj1) == JSON.stringify(obj2);
źródło
angular.toJson
usunie również $$ hashKeysTrochę za późno w tym wątku. angular.equals robi głębokie sprawdzenie, ale czy ktoś wie, dlaczego zachowuje się inaczej, jeśli jeden z elementów zawiera przedrostek „$”?
Możesz wypróbować to demo z następującymi danymi wejściowymi
var obj3 = {} obj3.a= "b"; obj3.b={}; obj3.b.$c =true; var obj4 = {} obj4.a= "b"; obj4.b={}; obj4.b.$c =true; angular.equals(obj3,obj4);
źródło
Wiem, że to trochę późna odpowiedź, ale właśnie straciłem około pół godziny debugowania z tego powodu. Może to zaoszczędzić komuś trochę czasu.
BĄDŹ UWAŻNY, jeśli używasz
angular.equals()
obiektów, które mają właściwośćobj.$something
(nazwa właściwości zaczyna się od $), te właściwości zostaną zignorowane w porównaniu.Przykład:
var obj1 = { $key0: "A", key1: "value1", key2: "value2", key3: {a: "aa", b: "bb"} } var obj2 = { $key0: "B" key2: "value2", key1: "value1", key3: {a: "aa", b: "bb"} } angular.equals(obj1, obj2) //<--- would return TRUE (despite it's not true)
źródło