Порівняйте об’єкти в Angular


79

Чи можна зробити "глибоке" порівняння двох об'єктів в Angular? Я хотів би зробити порівняння кожної пари ключ / значення. Наприклад:

Об'єкт 1

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

Об'єкт 2

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

Мені потрібно, щоб порівняння не вдалося, оскільки різниться лише одна з пар ключ / значення. Іншими словами, ВСІ пари ключ / значення повинні точно збігатися, інакше помилка. Це щось вже вбудоване в Angular. Я впевнений, що міг би написати свій власний сервіс, якщо б мені справді було потрібно, але я сподівався, що він уже вбудований. Подібно до angular.equals.

Відповіді:


205

Для порівняння двох об'єктів ви можете використовувати:

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

6
Зверніть увагу, що angular.equals перевіряє тотожність, а не рівність . TL; DR:angular.equals( { id: "12" }, { id: 12 } ) // is false
bobjones

@bobjones angular.equals повертає true на основі ідентичності АБО глибокої рівності, тому запропонований приклад поверне true. див. документацію angular.equals , зокрема Два об'єкти або значення вважаються еквівалентними, якщо принаймні одне з наступного відповідає дійсності
tommyTheHitMan

5
Приклад @tommyTheHitMan: bobjones повертається, falseоскільки на основі ідентичності "12"===12 // is false. Просто спробуйте.
klode

А якщо вам потрібен різний об’єкт для відстеження історії відкотів, дивіться це ... gist.github.com/katowulf/6193808
Позначте

4
Коротке зауваження: angular.equals () ігнорує всі властивості, що починаються з $, і всі властивості, значення яких є функціями, коли обидва аргументи є об'єктами.
im1dermike

24

Якщо припустити, що порядок однаковий в обох об’єктах, просто stringifyобидва і порівняйте!

JSON.stringify(obj1) == JSON.stringify(obj2);

14
angular.equals (obj1, obj2) також повинні працювати. Це не залежить від порядку ключів, і це глибокий (його називають рекурсивно) code.angularjs.org/1.2.0/docs/api/angular.equals
klode

4
Це було б дуже поганим припущенням!
голографічний принцип

1
angular.toJsonтакож видалить $$ hashKeys

5

На цій темі трохи пізно. 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);

4
З документації Angular: "Під час порівняння властивостей властивості типу функції та властивості з іменами, що починаються з $, ігноруються." docs.angularjs.org/api/ng/function/angular.equals
sonicwizard

2

Я знаю, що це якось пізня відповідь, але я просто втратив близько півгодини налагодження, тому це може заощадити комусь час.

ВНИМАЙТЕ, якщо ви використовуєте 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.