index.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. var has = Object.prototype.hasOwnProperty;
  2. function find(iter, tar, key) {
  3. for (key of iter.keys()) {
  4. if (dequal(key, tar)) return key;
  5. }
  6. }
  7. function dequal(foo, bar) {
  8. var ctor, len, tmp;
  9. if (foo === bar) return true;
  10. if (foo && bar && (ctor=foo.constructor) === bar.constructor) {
  11. if (ctor === Date) return foo.getTime() === bar.getTime();
  12. if (ctor === RegExp) return foo.toString() === bar.toString();
  13. if (ctor === Array) {
  14. if ((len=foo.length) === bar.length) {
  15. while (len-- && dequal(foo[len], bar[len]));
  16. }
  17. return len === -1;
  18. }
  19. if (ctor === Set) {
  20. if (foo.size !== bar.size) {
  21. return false;
  22. }
  23. for (len of foo) {
  24. tmp = len;
  25. if (tmp && typeof tmp === 'object') {
  26. tmp = find(bar, tmp);
  27. if (!tmp) return false;
  28. }
  29. if (!bar.has(tmp)) return false;
  30. }
  31. return true;
  32. }
  33. if (ctor === Map) {
  34. if (foo.size !== bar.size) {
  35. return false;
  36. }
  37. for (len of foo) {
  38. tmp = len[0];
  39. if (tmp && typeof tmp === 'object') {
  40. tmp = find(bar, tmp);
  41. if (!tmp) return false;
  42. }
  43. if (!dequal(len[1], bar.get(tmp))) {
  44. return false;
  45. }
  46. }
  47. return true;
  48. }
  49. if (ctor === ArrayBuffer) {
  50. foo = new Uint8Array(foo);
  51. bar = new Uint8Array(bar);
  52. } else if (ctor === DataView) {
  53. if ((len=foo.byteLength) === bar.byteLength) {
  54. while (len-- && foo.getInt8(len) === bar.getInt8(len));
  55. }
  56. return len === -1;
  57. }
  58. if (ArrayBuffer.isView(foo)) {
  59. if ((len=foo.byteLength) === bar.byteLength) {
  60. while (len-- && foo[len] === bar[len]);
  61. }
  62. return len === -1;
  63. }
  64. if (!ctor || typeof foo === 'object') {
  65. len = 0;
  66. for (ctor in foo) {
  67. if (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;
  68. if (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;
  69. }
  70. return Object.keys(bar).length === len;
  71. }
  72. }
  73. return foo !== foo && bar !== bar;
  74. }
  75. exports.dequal = dequal;