Vergleichen Sie Objekte in Angular

79

Ist es möglich, einen "tiefen" Vergleich zweier Objekte in Angular durchzuführen? Ich möchte jedes Schlüssel / Wert-Paar vergleichen. Zum Beispiel:

Objekt 1

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

Objekt 2

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

Was ich brauche, ist, dass der Vergleich fehlschlägt, da nur eines der Schlüssel / Wert-Paare unterschiedlich ist. Mit anderen Worten, ALLE Schlüssel / Wert-Paare müssen genau übereinstimmen, sonst ist ein Fehler aufgetreten. Ist das schon etwas in Angular eingebaut? Ich bin mir sicher, dass ich meinen eigenen Service schreiben könnte, wenn ich es wirklich brauchte, aber ich hatte gehofft, dass er bereits eingebaut ist. Ähnlich wie bei angle.equals.

Selanac82
quelle

Antworten:

205

So vergleichen Sie zwei Objekte:

angular.equals(obj1, obj2)

Es führt einen gründlichen Vergleich durch und hängt nicht von der Reihenfolge der Tasten ab. Siehe AngularJS DOCS und eine kleine 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
klode
quelle
6
Beachten Sie, dass angle.equals die Identität und nicht die Gleichheit testet . TL; DR:angular.equals( { id: "12" }, { id: 12 } ) // is false
Bobjones
@bobjones angular.equals gibt true basierend auf Identität ODER tiefer Gleichheit zurück, sodass Ihr vorgeschlagenes Beispiel true zurückgeben würde. Siehe die Dokumentation zu angle.equals , insbesondere Zwei Objekte oder Werte werden als gleichwertig angesehen, wenn mindestens eines der folgenden
Elemente
5
@tommyTheHitMan: Bobjones Beispiel gibt zurück, falseweil, basierend auf Identität , "12"===12 // is false. Probieren Sie es einfach aus.
Klode
Und wenn Sie ein Diff-Objekt zum Verfolgen des Verlaufs für Rollbacks benötigen, sehen Sie dies ... gist.github.com/katowulf/6193808
Mark
4
Ein kurzer Hinweis: angle.equals () ignoriert alle Eigenschaften, die mit $ beginnen, und alle Eigenschaften, deren Werte Funktionen sind, wenn beide Argumente Objekte sind.
im1dermike
24

Angenommen, die Reihenfolge ist in beiden Objekten gleich, nur stringifybeide und vergleichen!

JSON.stringify(obj1) == JSON.stringify(obj2);
tymeJV
quelle
14
angle.equals (obj1, obj2) sollten ebenfalls funktionieren. Es hängt nicht von der Schlüsselreihenfolge ab und ist tief (es wird rekursiv genannt) code.angularjs.org/1.2.0/docs/api/angular.equals
klode
4
Das wäre eine sehr schlechte Annahme!
Holographisches Prinzip
1
angular.toJsonwürde auch die $$ hashKeys entfernen
5

Etwas spät in diesem Thread. angular.equals prüft tief, aber weiß jemand, warum es sich anders verhält, wenn eines der Mitglieder das Präfix "$" enthält?

Sie können diese Demo mit folgenden Eingaben ausprobieren

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);
KM.
quelle
4
Aus der Angular-Dokumentation: "Während eines Eigenschaftsvergleichs werden Eigenschaften des Funktionstyps und Eigenschaften mit Namen, die mit $ beginnen, ignoriert." docs.angularjs.org/api/ng/function/angular.equals
Sonicwizard
2

Ich weiß, dass es eine etwas späte Antwort ist, aber ich habe gerade eine halbe Stunde beim Debuggen verloren. Das könnte jemandem Zeit sparen.

ACHTUNG: Wenn Sie angular.equals()Objekte mit einer Eigenschaft verwenden obj.$something (der Eigenschaftsname beginnt mit $), werden diese Eigenschaften im Vergleich ignoriert.

Beispiel:

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)
DanteTheSmith
quelle