Parcourir la source

impl isDeepEquals

Shun Miyazawa il y a 1 an
Parent
commit
e0b74c264a
1 fichiers modifiés avec 30 ajouts et 0 suppressions
  1. 30 0
      apps/app/src/utils/is-deep-equal.ts

+ 30 - 0
apps/app/src/utils/is-deep-equal.ts

@@ -0,0 +1,30 @@
+export const isDeepEquals = <T extends object>(obj1: T, obj2: T): boolean => {
+  const typedKeys1 = Object.keys(obj1) as (keyof T)[];
+  const typedKeys2 = Object.keys(obj2) as (keyof T)[];
+
+  if (typedKeys1.length !== typedKeys2.length) {
+    return false;
+  }
+
+  return typedKeys1.every((key) => {
+    const val1 = obj1[key];
+    const val2 = obj2[key];
+
+    if (typeof val1 === 'object' && typeof val2 === 'object') {
+      if (val1 === null || val2 === null) {
+        return val1 === val2;
+      }
+
+      // if array
+      if (Array.isArray(val1) && Array.isArray(val2)) {
+        return val1.length === val2.length && val1.every((item, i) => val2[i] === item);
+      }
+
+      // if object
+      return isDeepEquals(val1, val2);
+    }
+
+    // if primitive
+    return val1 === val2;
+  });
+};