Last active
October 29, 2015 02:25
-
-
Save tobychung/3ee9625673e195a65165 to your computer and use it in GitHub Desktop.
比較obj差異
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function findDifferences(objectA, objectB) { | |
var propertyChanges = []; | |
var objectGraphPath = ["this"]; | |
(function(a, b) { | |
if(a.constructor == Array) { | |
// BIG assumptions here: That both arrays are same length, that | |
// the members of those arrays are _essentially_ the same, and | |
// that those array members are in the same order... | |
for(var i = 0; i < a.length; i++) { | |
objectGraphPath.push("[" + i.toString() + "]"); | |
arguments.callee(a[i], b[i]); | |
objectGraphPath.pop(); | |
} | |
} else if(a.constructor == Object || (a.constructor != Number && | |
a.constructor != String && a.constructor != Date && | |
a.constructor != RegExp && a.constructor != Function && | |
a.constructor != Boolean)) { | |
// we can safely assume that the objects have the | |
// same property lists, else why compare them? | |
for(var property in a) { | |
objectGraphPath.push(("." + property)); | |
if(a[property].constructor != Function) { | |
arguments.callee(a[property], b[property]); | |
} | |
objectGraphPath.pop(); | |
} | |
} else if(a.constructor != Function) { // filter out functions | |
if(a != b) { | |
propertyChanges.push({ "Property": objectGraphPath.join(""), "ObjectA": a, "ObjectB": b }); | |
} | |
} | |
})(objectA, objectB); | |
return propertyChanges; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment