isEqual.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = void 0;
  7. var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
  8. var _warning = _interopRequireDefault(require("./warning"));
  9. /**
  10. * Deeply compares two object literals.
  11. * @param obj1 object 1
  12. * @param obj2 object 2
  13. * @param shallow shallow compare
  14. * @returns
  15. */
  16. function isEqual(obj1, obj2) {
  17. var shallow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  18. // https://github.com/mapbox/mapbox-gl-js/pull/5979/files#diff-fde7145050c47cc3a306856efd5f9c3016e86e859de9afbd02c879be5067e58f
  19. var refSet = new Set();
  20. function deepEqual(a, b) {
  21. var level = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
  22. var circular = refSet.has(a);
  23. (0, _warning.default)(!circular, 'Warning: There may be circular references');
  24. if (circular) {
  25. return false;
  26. }
  27. if (a === b) {
  28. return true;
  29. }
  30. if (shallow && level > 1) {
  31. return false;
  32. }
  33. refSet.add(a);
  34. var newLevel = level + 1;
  35. if (Array.isArray(a)) {
  36. if (!Array.isArray(b) || a.length !== b.length) {
  37. return false;
  38. }
  39. for (var i = 0; i < a.length; i++) {
  40. if (!deepEqual(a[i], b[i], newLevel)) {
  41. return false;
  42. }
  43. }
  44. return true;
  45. }
  46. if (a && b && (0, _typeof2.default)(a) === 'object' && (0, _typeof2.default)(b) === 'object') {
  47. var keys = Object.keys(a);
  48. if (keys.length !== Object.keys(b).length) {
  49. return false;
  50. }
  51. return keys.every(function (key) {
  52. return deepEqual(a[key], b[key], newLevel);
  53. });
  54. }
  55. // other
  56. return false;
  57. }
  58. return deepEqual(obj1, obj2);
  59. }
  60. var _default = exports.default = isEqual;