Pregunta Comparar objetos en Angular


¿Es posible hacer una comparación "profunda" de dos objetos en Angular? Lo que me gustaría hacer es comparar cada par clave / valor. Por ejemplo:

Objeto 1

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

Objeto 2

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

Lo que necesito es que la comparación falle, ya que solo uno de los pares clave / valor es diferente. En otras palabras, TODOS los pares clave / valor deben coincidir exactamente o de lo contrario falla. ¿Esto ya está incorporado en Angular? Estoy seguro de que podría escribir mi propio servicio si realmente lo necesitaba, pero esperaba que ya estuviera incorporado. Similar a angular.equals.


73
2017-12-05 20:13


origen


Respuestas:


Para comparar dos objetos, puede usar:

angular.equals(obj1, obj2)

Hace una comparación profunda y no depende del orden de las claves Ver AngularJS DOCS y un poco Manifestación

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

196
2017-12-05 21:13



Suponiendo que el orden es el mismo en ambos objetos, solo stringify ¡ambos y compara!

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

21
2017-12-05 20:16



Un poco tarde en este hilo. angular.equals hace una comprobación profunda, sin embargo, ¿alguien sabe por qué se comporta de manera diferente si uno de los miembros contiene "$" en el prefijo?

Puedes intentar esto Manifestación  con la siguiente entrada

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);

5
2018-03-04 06:12



Sé que es una respuesta tardía, pero acabo de perder una media hora debido a esto, podría ahorrarle a alguien algo de tiempo.

SE CUIDADO, si usa angular.equals() en objetos que tienen propiedad obj.$something  (el nombre de propiedad comienza con $) esas propiedades serán ignoradas en comparación.

Ejemplo:

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)

1
2017-12-12 12:15