[angularjs] Angular에서 개체 비교

Angular에서 두 개체를 “심층”비교하는 것이 가능합니까? 내가하고 싶은 것은 각 키 / 값 쌍을 비교하는 것입니다. 예를 들면 :

개체 1

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

개체 2

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

내가 필요한 것은 키 / 값 쌍 중 하나만 다르기 때문에 비교가 실패하는 것입니다. 즉, 모든 키 / 값 쌍이 정확히 일치해야하며 그렇지 않으면 실패합니다. 이것은 이미 Angular에 내장되어 있습니까? 정말로 필요하다면 나만의 서비스를 작성할 수 있다고 확신하지만, 이미 내장되어 있기를 바랐습니다. angular.equals와 비슷합니다.



답변

두 개체를 비교하려면 다음을 사용할 수 있습니다.

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


답변

순서가 두 개체에서 동일하다고 가정 stringify하고 둘 다만 비교하십시오!

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


답변

이 스레드에서 조금 늦었습니다. 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);


답변

나는 그것이 다소 늦은 대답이라는 것을 알고 있지만 이것의 원인으로 약 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)


답변