Advertisement
Guest User

Untitled

a guest
Jul 13th, 2018
657
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.33 KB | None | 0 0
  1. // Check value's data type (object, string, number, function)
  2. var checkType = function(data) {
  3. var typeString = Object.prototype.toString.call(data).split(' ');
  4. var type = typeString[1].slice(0, -1);
  5.  
  6. return type;
  7. }
  8.  
  9. // Self explanatory
  10. var hasOwn = function(obj, key) {
  11. return obj.hasOwnProperty(key);
  12. }
  13.  
  14. /**
  15. Check if two values are deepEqual regardless of its type. 'key' here is an
  16. attribute name, because if we're comparing objects we want to return the
  17. differences from it but we need to know the name of the attribute itself.
  18. **/
  19. var isEqual = function(value1, value2, callback, key) {
  20. // We only need to compare one because they will have the same type
  21. var type = checkType(value1);
  22.  
  23. if(type === 'Array') {
  24. value1 = value1.sort();
  25. value2 = value2.sort();
  26. if (value1.length !== value2.length) { return false; }
  27.  
  28. for (var x = 0; x < value1.length; x++) {
  29. if (checkType(value1[x]) === 'Object' && callback) {
  30. var result = callback(value1[x], value2[x], key);
  31.  
  32. if(!result.one.length) { return true; }
  33. }
  34.  
  35. else {
  36. for (var x = 0; x < value1.length; x++) {
  37. if (checkType(value1[x] === 'Function') && value1.toString() !== value2.toString()) {
  38. return false;
  39. }
  40. if (value1[x].toString() !== value2[x].toString()) {
  41. return false;
  42. };
  43. }
  44. }
  45. }
  46. }
  47.  
  48. // If we're comparing objects, we need to go deep :kappa:
  49. else if (type === 'Object' && callback) {
  50. var result = callback(value1, value2, key);
  51.  
  52. if(!result.one.length) { return true; }
  53. }
  54.  
  55. else {
  56. if(value1.toString() !== value2.toString()) {
  57. return false;
  58. }
  59. }
  60.  
  61. return true;
  62. }
  63.  
  64. var result = {
  65. one: [],
  66. two: []
  67. };
  68.  
  69. var deepDiff = function(objA, objB, key) {
  70. var keysA = Object.keys(objA);
  71.  
  72. for (var i = 0; i < keysA.length; i++) {
  73. if (
  74. hasOwn(objB, keysA[i]) &&
  75. !isEqual(objA[keysA[i]], objB[keysA[i]], deepDiff, keysA[i])
  76. ) {
  77. if (key) {
  78. result.one.push({ [key]: { [keysA[i]]: objA[keysA[i]] }});
  79. result.two.push({ [key]: { [keysA[i]]: objB[keysA[i]] }});
  80. } else {
  81. result.one.push({ [keysA[i]]: objA[keysA[i]] });
  82. result.two.push({ [keysA[i]]: objB[keysA[i]] });
  83. }
  84. }
  85. }
  86.  
  87. return result;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement