Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Check value's data type (object, string, number, function)
- var checkType = function(data) {
- var typeString = Object.prototype.toString.call(data).split(' ');
- var type = typeString[1].slice(0, -1);
- return type;
- }
- // Self explanatory
- var hasOwn = function(obj, key) {
- return obj.hasOwnProperty(key);
- }
- /**
- Check if two values are deepEqual regardless of its type. 'key' here is an
- attribute name, because if we're comparing objects we want to return the
- differences from it but we need to know the name of the attribute itself.
- **/
- var isEqual = function(value1, value2, callback, key) {
- // We only need to compare one because they will have the same type
- var type = checkType(value1);
- if(type === 'Array') {
- value1 = value1.sort();
- value2 = value2.sort();
- if (value1.length !== value2.length) { return false; }
- for (var x = 0; x < value1.length; x++) {
- if (checkType(value1[x]) === 'Object' && callback) {
- var result = callback(value1[x], value2[x], key);
- if(!result.one.length) { return true; }
- }
- else {
- for (var x = 0; x < value1.length; x++) {
- if (checkType(value1[x] === 'Function') && value1.toString() !== value2.toString()) {
- return false;
- }
- if (value1[x].toString() !== value2[x].toString()) {
- return false;
- };
- }
- }
- }
- }
- // If we're comparing objects, we need to go deep :kappa:
- else if (type === 'Object' && callback) {
- var result = callback(value1, value2, key);
- if(!result.one.length) { return true; }
- }
- else {
- if(value1.toString() !== value2.toString()) {
- return false;
- }
- }
- return true;
- }
- var result = {
- one: [],
- two: []
- };
- var deepDiff = function(objA, objB, key) {
- var keysA = Object.keys(objA);
- for (var i = 0; i < keysA.length; i++) {
- if (
- hasOwn(objB, keysA[i]) &&
- !isEqual(objA[keysA[i]], objB[keysA[i]], deepDiff, keysA[i])
- ) {
- if (key) {
- result.one.push({ [key]: { [keysA[i]]: objA[keysA[i]] }});
- result.two.push({ [key]: { [keysA[i]]: objB[keysA[i]] }});
- } else {
- result.one.push({ [keysA[i]]: objA[keysA[i]] });
- result.two.push({ [keysA[i]]: objB[keysA[i]] });
- }
- }
- }
- return result;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement