Ich habe ein wenig an einem einfachen Algorithmus gearbeitet, um den Inhalt zweier Objekte zu vergleichen und eine verständliche Liste von Unterschieden zurückzugeben. Ich dachte, ich würde teilen. Es leiht sich einige Ideen für jQuery aus, nämlich diemap Funktionsimplementierung und die Überprüfung des Objekt- und Array-Typs.
Es wird eine Liste von "diff-Objekten" zurückgegeben, bei denen es sich um Arrays mit den diff-Informationen handelt. Es ist sehr einfach.
Hier ist es:
function DiffObjects(o1, o2) {
var map = Array.prototype.map?
function(a) { return Array.prototype.map.apply(a, Array.prototype.slice.call(arguments, 1)); } :
function(a, f) {
var ret = new Array(a.length), value;
for ( var i = 0, length = a.length; i < length; i++ )
ret[i] = f(a[i], i);
return ret.concat();
};
var push = Array.prototype.push;
if ((o1 == null) || (o2 == null)) {
if (o1 != o2)
return [["", "null", o1!=null, o2!=null]];
return undefined;
}
if ((o1.constructor != o2.constructor) ||
(typeof o1 != typeof o2)) {
return [["", "type", Object.prototype.toString.call(o1), Object.prototype.toString.call(o2) ]];
}
if (Object.prototype.toString.call(o1) == "[object Array]") {
if (o1.length != o2.length) {
return [["", "length", o1.length, o2.length]];
}
var diff =[];
for (var i=0; i<o1.length; i++) {
var innerDiff = DiffObjects(o1[i], o2[i]);
if (innerDiff) {
push.apply(diff, map(innerDiff, function(o, j) { o[0]="[" + i + "]" + o[0]; return o; }));
}
}
if (diff.length)
return diff;
return undefined;
}
if (Object.prototype.toString.call(o1) == "[object Object]") {
var diff =[];
for (var prop in o1) {
if ((typeof o2[prop] == "undefined") && (typeof o1[prop] != "undefined")) {
diff.push(["[" + prop + "]", "undefined", o1[prop], undefined]);
}
else {
var innerDiff = DiffObjects(o1[prop], o2[prop]);
if (innerDiff) {
push.apply(diff, map(innerDiff, function(o, j) { o[0]="[" + prop + "]" + o[0]; return o; }));
}
}
}
for (var prop in o2) {
if ((typeof o1[prop] == "undefined") && (typeof o2[prop] != "undefined")) {
diff.push(["[" + prop + "]", "undefined", undefined, o2[prop]]);
}
}
if (diff.length)
return diff;
return undefined;
}
if (o1 != o2)
return [["", "value", o1, o2]];
return undefined;
}
yes eine Supermenge von sein darfx.