Frage (Aus Eloquent Javascript 2nd Edition, Kapitel 4, Übung 4):
Schreiben Sie eine Funktion, deepEqual, die zwei Werte akzeptiert und nur dann true zurückgibt, wenn sie sie enthält sind der gleiche Wert oder sind Objekte mit den gleichen Eigenschaften, deren Werte auch sind gleich im Vergleich zu einem rekursiven Aufruf von deepEqual.
Testfälle:
%Vor%Mein Code:
%Vor%Ich denke, ich habe die allgemeine Idee unten; Wie ich jedoch im Kommentar gesagt habe, wird das Programm die zweite Eigenschaft in den Objekten nicht überprüfen. Ich habe das Gefühl, ein strukturelles / logisches Problem zu haben und verwende Rekursion einfach auf die falsche Weise, da ich ursprünglich die Eigenschaften durchlaufen wollte, Rekursion verwende, um die Werte der ersten Eigenschaft zu vergleichen und dann in der Schleife zur nächsten weiterzumachen Eigenschaft und erneut vergleichen. Obwohl, ich bin mir nicht sicher, ob das überhaupt möglich ist?
Ich habe viel darüber nachgedacht und ein paar verschiedene Ansätze versucht, aber das war die richtigste Antwort, auf die ich bisher gekommen bin. Irgendwelche Tipps, um mich in die richtige Richtung zu weisen?
Wie Sie vermuten, geben Sie das Spiel der ersten angezeigten Eigenschaft zurück. Sie sollten false
zurückgeben, wenn diese Eigenschaft nicht übereinstimmt, aber suchen Sie weiter.
Geben Sie auch false
zurück, wenn keine prop
-Eigenschaft in y
gefunden wurde (dh die Anzahl stimmt überein, aber nicht die tatsächlichen Eigenschaften).
Wenn alle Eigenschaften übereinstimmen, geben Sie true
:
Sie können eine Variable außerhalb der for-Schleife verwenden, um den Vergleich zu verfolgen:
%Vor% Das vorherige Beispiel ist nicht absichtlich optimiert. Da Sie Objekte vergleichen, wissen Sie, dass Sie return false
verwenden können, sobald Sie eine Ungleichheit finden, und Sie können die Schleife fortsetzen, während alle zuvor überprüften Eigenschaften gleich sind:
Ich bin ziemlich neu in JS, aber so habe ich es gelöst:
%Vor%Und hier sind meine Tests:
%Vor%Fühle, dass diese Version etwas lesbarer ist (leichter zu verstehen). Die Logik ist der Top-Antwort sehr ähnlich. (ES6 diesmal)
%Vor%Übrigens gibt es eine Cheater-Version von deep equal, die wie ein Zauber wirkt)) Allerdings ist es ungefähr 1,6 mal langsamer.
%Vor%Ich bin gerade durch dieses Kapitel gegangen und wollte auch meine Arbeit zeigen.
Der Fehler in mir (lass es mich wissen, wenn es mehr gibt) ist, dass die Objekteigenschaften auch in der richtigen Reihenfolge sein müssen. Ich bevorzuge die Lösung von @paul und @ danni.
Tags und Links javascript recursion