Подтвердить что ты не робот

Сравнить объекты в Angular

Можно ли выполнить "глубокое" сравнение двух объектов в Angular? То, что я хотел бы сделать, это сравнить каждую пару ключ/значение. Например:

Объект 1

{
   key1: "value1",
   key2: "value2",
   key3: "value3"
}

Объект 2

{
   key1: "value1",
   key2: "newvalue",
   key3: "value3" 
}

Мне нужно, чтобы сравнение потерпело неудачу, так как только одна из пар ключ/значение имеет различный характер. Другими словами, все пары ключ/значение должны точно совпадать или сбой. Это уже что-то уже встроено в Angular. Я уверен, что я мог бы написать свой собственный сервис, если мне действительно нужно, но я надеялся, что он уже встроен. Подобно Angular.equals.

4b9b3361

Ответ 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)