Javascript - deepEqual Vergleich
Frage (Von Eloquent Javascript, 2. Auflage, Kapitel 4, Übung 4):
Schreiben Sie eine Funktion, deepEqual, das dauert zwei Werten und gibt true nur, wenn Sie
sind den gleichen Wert oder sind Objekte mit gleichen Eigenschaften, deren Werte auch
gleich, wenn im Vergleich mit einem rekursiven Aufruf deepEqual.
Testfälle:
var obj = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj, obj));
//→ true
console.log(deepEqual(obj, {here: 1, object: 2}));
//→ false
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));
//→ true
Mein code:
var deepEqual = function (x, y) {
if ((typeof x == "object" && x != null) && (typeof y == "object" && y != null)) {
if (Object.keys(x).length != Object.keys(y).length)
return false;
for (var prop in x) {
if (y.hasOwnProperty(prop))
return deepEqual(x[prop], y[prop]);
/*This is most likely where my error is. The question states that all the values
should be checked via recursion; however, with the current setup, only the first
set of properties will be checked. It passes the test cases, but I would like
to solve the problem correctly!*/
}
}
else if (x !== y)
return false;
else
return true;
}
Ich glaube, ich habe die Allgemeine Idee, nach unten; aber, wie ich bereits im Kommentar, das Programm wird nicht auf der zweiten Eigenschaft der Objekte. Ich fühle mich wie ich haben eine Struktur - /Logik-problem und ich bin einfach mit Rekursion in die falsche Richtung, als ich ursprünglich gedacht, um eine Schleife durch die Eigenschaften, die Verwendung der Rekursion zum Vergleich der Werte der ersten Eigenschaft, dann weiter in der Schleife die next-Eigenschaft und vergleichen Sie erneut. Obwohl, ich bin mir nicht sicher, ob das überhaupt möglich ist?
Ich habe eine gute Menge von Gedanken und versucht, ein paar verschiedene Ansätze, aber das war die richtige Antwort, ich habe es so weit. Alle möglichen Tipps, um mich in die richtige Richtung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Sie vermuten, sind Sie der Rückkehr das match von der ersten Eigenschaft gesehen. Sollten Sie wieder
false
wenn diese Eigenschaft nicht übereinstimmen, aber halten uns ansonsten.Auch, zurück
false
wenn es keineprop
- Eigenschaft finden Sie aufy
(das ist die, die zählt-match, sondern nicht die eigentlichen Eigenschaften).Wenn alle Eigenschaften übereinstimmen, zurück
true
:JS:
.hasOwnProperty()
Prüfung auf die Eigenschaft von "x", oder, noch besser, verwenden Sie die return-Werte bereits erreicht durch die AufrufeObject.keys()
zu tun, der iteration, da diese bereits begrenzt sein, um "eigenen" Eigenschaften".var a = {foo: 3}; a.bar = a; deepEqual(a, a);
Gefühl, dass diese version ein bisschen mehr lesbar (einfacher zu verstehen). Die Logik ist sehr ähnlich mit der top-Antwort obwohl. (ES6 dieser Zeit)
Durch die Art und Weise, es ist ein cheater version der Tiefe gleich, die funktioniert wie ein Charme)) Aber, es ist etwa 1,6-mal langsamer.
Wie bemerkt, durch zero298, dieser Ansatz ist empfindlich auf die Eigenschaften der Bestellung und sollten nicht ernst genommen werden
JSON.stringify({foo:"bar",fizz:"buzz"}) === JSON.stringify({fizz:"buzz", foo:"bar"});
falsch ist; aberJSON.stringify({foo:"bar",fizz:"buzz"}) === JSON.stringify({foo:"bar",fizz:"buzz"});
wahr ist.Können Sie eine variable außerhalb der for-Schleife, um eine Spur der Vergleich:
Dem vorhergehenden Beispiel ist nicht optimiert auf den Zweck. Weil Ihnen der Vergleich von Objekten, wissen Sie, dass Sie
return false
sobald Sie Sie finden, eine Ungleichheit, und Sie können halten, looping, während alle früheren, aufgegebenen Eigenschaften sind gleich:{ a: 1, b: 2 }
im Vergleich zu{ c : 3, d: 4 }
, dahasOwnProperty()
wird immer falsch sein und alle tests werden übersprungen.Ich bin ganz neu mit JS, aber das ist die Art, wie ich es gelöst:
Und hier sind meine tests:
Obwohl, es ist Ausführlicher, vielleicht ist diese option einfacher zu Lesen ist:
HTML:
Ich ging gerade durch dieses Kapitel und wollte meine arbeiten zeigen, auch.
Den Fehler bei mir (lassen Sie mich wissen, wenn es mehrere sind) ist, dass die Objekt-Eigenschaften werden in der exakten Reihenfolge, wie gut. Ich viel lieber @paul und @danni ' s Lösung.
JS:
CSS:
HTML: