Сравнить объекты в Angular
Можно ли выполнить "глубокое" сравнение двух объектов в Angular? То, что я хотел бы сделать, это сравнить каждую пару ключ/значение. Например:
Объект 1
{
key1: "value1",
key2: "value2",
key3: "value3"
}
Объект 2
{
key1: "value1",
key2: "newvalue",
key3: "value3"
}
Мне нужно, чтобы сравнение потерпело неудачу, так как только одна из пар ключ/значение имеет различный характер. Другими словами, все пары ключ/значение должны точно совпадать или сбой. Это уже что-то уже встроено в Angular. Я уверен, что я мог бы написать свой собственный сервис, если мне действительно нужно, но я надеялся, что он уже встроен. Подобно Angular.equals.
Ответы
Ответ 1
Чтобы сравнить два объекта, которые вы можете использовать:
angular.equals(obj1, obj2)
Это делает глубокое сравнение и не зависит от порядка ключей
Смотрите AngularJS DOCS и немного Демо
var obj1 = {
key1: "value1",
key2: "value2",
key3: {a: "aa", b: "bb"}
}
var obj2 = {
key2: "value2",
key1: "value1",
key3: {a: "aa", b: "bb"}
}
angular.equals(obj1, obj2) //<--- would return true
Ответ 2
Предполагая, что порядок одинаковый для обоих объектов, просто stringify
их обоих и сравните!
JSON.stringify(obj1) == JSON.stringify(obj2);
Ответ 3
Бит поздно в этой теме.
angular.equals делает глубокую проверку, однако кто-нибудь знает, почему он ведет себя по-другому, если один из членов содержит "$" в префиксе?
Вы можете попробовать этот Demo со следующим входом
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);
Ответ 4
Я знаю это как-то поздний ответ, но я просто потерял примерно половину часа отладки этой причины, он может кого-то сэкономить.
BE MINDFUL, если вы используете 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 not true)