2013-12-05 5 views
68

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

Объект 1

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

Объект 2

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

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

ответ

189

Для сравнения двух объектов, вы можете использовать:

angular.equals(obj1, obj2)

Он делает глубокий сравнение и не зависит от порядка ключей См AngularJS DOCS и немного Demo

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 
+21

Это должно быть отмечено как ответ, даже делает глубокое сравнение! +1 – tymeJV

+4

Обратите внимание, что тесты угловых.равнов [идентичность, ** не ** равенство] (http://stackoverflow.com/questions/5447024/javascript-comparison-operators-identity-vs-equality). TL; DR: 'angular.equals ({id:" 12 "}, {id: 12}) // is false' – bobjones

+0

@bobjones angular.equals возвращает true на основе идентичности или глубокого равенства, поэтому ваш предложенный пример вернется правда. см. документацию [angular.equals] (https://docs.angularjs.org/api/ng/function/angular.равным), в частности Два объекта или значения считаются эквивалентными, если выполняется хотя бы одно из следующих значений: – tommyTheHitMan

20

Предполагая, что заказ одинаковый для обоих объектов, просто stringify их обоих и сравните!

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

Я знал, что там было что-то простое, как это. Спасибо @tymeJV – selanac82

+14

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

+3

@klode - Опубликовать, что не знал о это :) – tymeJV

4

Бит поздно на эту тему. 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); 
+3

Из документа «Угловая»: «Во время сравнения свойств свойства типа функции и свойства с именами, начинающимися с $, игнорируются». https://docs.angularjs.org/api/ng/function/angular.equals – sonicwizard

1

Я знаю, что это своего рода поздний ответ, но я просто потерял около полчаса отладки причину этого, он может спасти кому-то какое-то время.

Помяни, если вы используете 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) 
Смежные вопросы