¿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 fallarán. ¿Es esto algo que ya está integrado en Angular? Estoy seguro de que podría escribir mi propio servicio si realmente lo necesitara, pero esperaba que ya estuviera integrado. Similar a angular.equals.
angular.equals( { id: "12" }, { id: 12 } ) // is false
false
, ya que, sobre la base de la identidad,"12"===12 // is false
. Pruébelo.Suponiendo que el orden es el mismo en ambos objetos, ¡solo
stringify
en ambos y compare!JSON.stringify(obj1) == JSON.stringify(obj2);
fuente
angular.toJson
también eliminaría las $$ hashKeysUn poco tarde en este hilo. angular.equals hace una verificación profunda, sin embargo, ¿alguien sabe por qué se comporta de manera diferente si uno de los miembros contiene "$" en el prefijo?
Puede probar esta demostració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);
fuente
Sé que es una respuesta un poco tardía, pero acabo de perder alrededor de media hora depurando la causa de esto, podría ahorrarle a alguien algo de tiempo.
TENGA EN CUENTA, si usa
angular.equals()
en objetos que tienen propiedadobj.$something
(el nombre de la propiedad comienza con $), esas propiedades se ignorarán 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)
fuente