diff.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = diff;
  7. var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
  8. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  9. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  10. /* eslint no-proto: 0 */
  11. function createArray() {
  12. var arr = [];
  13. arr.__proto__ = new Array();
  14. arr.__proto__.format = function toString() {
  15. return this.map(function (obj) {
  16. return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, obj), {}, {
  17. path: obj.path.join(' > ')
  18. });
  19. });
  20. };
  21. arr.__proto__.toString = function toString() {
  22. return JSON.stringify(this.format(), null, 2);
  23. };
  24. return arr;
  25. }
  26. function diff(obj1, obj2) {
  27. var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10;
  28. var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
  29. var diffList = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : createArray();
  30. if (depth <= 0) return diffList;
  31. var keys = new Set([].concat((0, _toConsumableArray2.default)(Object.keys(obj1)), (0, _toConsumableArray2.default)(Object.keys(obj2))));
  32. keys.forEach(function (key) {
  33. var value1 = obj1[key];
  34. var value2 = obj2[key];
  35. // Same value
  36. if (value1 === value2) return;
  37. var type1 = (0, _typeof2.default)(value1);
  38. var type2 = (0, _typeof2.default)(value2);
  39. // Diff type
  40. if (type1 !== type2) {
  41. diffList.push({
  42. path: path.concat(key),
  43. value1: value1,
  44. value2: value2
  45. });
  46. return;
  47. }
  48. // NaN
  49. if (Number.isNaN(value1) && Number.isNaN(value2)) {
  50. return;
  51. }
  52. // Object & Array
  53. if (type1 === 'object' && value1 !== null && value2 !== null) {
  54. diff(value1, value2, depth - 1, path.concat(key), diffList);
  55. return;
  56. }
  57. // Rest
  58. diffList.push({
  59. path: path.concat(key),
  60. value1: value1,
  61. value2: value2
  62. });
  63. });
  64. return diffList;
  65. }