Можно ли в Angular провести «глубокое» сравнение двух объектов? Я хотел бы сравнить каждую пару ключ / значение. Например:
Объект 1
{
key1: "value1",
key2: "value2",
key3: "value3"
}
Объект 2
{
key1: "value1",
key2: "newvalue",
key3: "value3"
}
Мне нужно, чтобы сравнение не удалось, поскольку только одна из пар ключ / значение отличается. Другими словами, ВСЕ пары ключ / значение должны точно совпадать, иначе произойдет сбой. Это что-то уже встроено в Angular. Я уверен, что мог бы написать свой собственный сервис, если бы мне действительно было нужно, но я надеялся, что он уже встроен. Подобно angular.equals.
angular.equals( { id: "12" }, { id: 12 } ) // is false
false
потому что на основе идентичности"12"===12 // is false
. Просто попробуйте.Предполагая, что порядок в обоих объектах одинаковый, просто
stringify
их обоих и сравните!JSON.stringify(obj1) == JSON.stringify(obj2);
источник
angular.toJson
также удалил бы $$ hashKeysНемного поздно на этой теме. angular.equals выполняет глубокую проверку, однако кто-нибудь знает, почему он ведет себя по-другому, если один из членов содержит префикс «$»?
Вы можете попробовать эту демонстрацию со следующим вводом
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);
источник
Я знаю, что это довольно поздний ответ, но я только что потерял около получаса на отладку из-за этого. Это может сэкономить кому-то время.
БУДЬТЕ ВНИМАТЕЛЬНЫ, если вы используете
angular.equals()
объекты, у которых есть свойствоobj.$something
(имя свойства начинается с $), эти свойства будут проигнорированы при сравнении.Пример:
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)
источник