isEqual.js 1.5 KB

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