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는 equality가 아니라 identity를 테스트 합니다. TL; DR :angular.equals( { id: "12" }, { id: 12 } ) // is false
bobjones 2014 년

@bobjones angular.equals는 ID 또는 깊은 평등을 기반으로 true를 반환하므로 제안 된 예제는 true를 반환합니다. 투시 angular.equals 문서 다음 중 적어도 하나에 해당하는 경우 특히 두 개체 또는 값이 동일하게 간주됩니다,
tommyTheHitMan

5
@tommyTheHitMan : bobjones 예제는 falseID에 따라 "12"===12 // is false. 시도해보십시오.
klode

롤백 기록을 추적하기 위해 diff 객체가 필요한 경우 다음을 참조하십시오. gist.github.com/katowulf/6193808
Mark

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
그것은 매우 나쁜 가정입니다!
holographic-principle

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

나는 그것이 다소 늦은 대답이라는 것을 알고 있지만 이것의 원인으로 약 30 분의 디버깅을 잃었습니다. 누군가 시간을 절약 할 수 있습니다.

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's not true)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.