isEqual.js 1.7 KB

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