is-deep-equal.ts 795 B

123456789101112131415161718192021222324252627282930
  1. export const isDeepEquals = <T extends object>(obj1: T, obj2: T): boolean => {
  2. const typedKeys1 = Object.keys(obj1) as (keyof T)[];
  3. const typedKeys2 = Object.keys(obj2) as (keyof T)[];
  4. if (typedKeys1.length !== typedKeys2.length) {
  5. return false;
  6. }
  7. return typedKeys1.every((key) => {
  8. const val1 = obj1[key];
  9. const val2 = obj2[key];
  10. if (typeof val1 === 'object' && typeof val2 === 'object') {
  11. if (val1 === null || val2 === null) {
  12. return val1 === val2;
  13. }
  14. // if array
  15. if (Array.isArray(val1) && Array.isArray(val2)) {
  16. return val1.length === val2.length && val1.every((item, i) => val2[i] === item);
  17. }
  18. // if object
  19. return isDeepEquals(val1, val2);
  20. }
  21. // if primitive
  22. return val1 === val2;
  23. });
  24. };