소스 검색

新增deepMerge

li.shaoyi 4 년 전
부모
커밋
77b67d14b8
1개의 변경된 파일31개의 추가작업 그리고 0개의 파일을 삭제
  1. 31 0
      src/utils/objHandle/index.ts

+ 31 - 0
src/utils/objHandle/index.ts

@@ -70,3 +70,34 @@ export function objectToUint8Array(data: object | string) {
 //     return outputArray;
 // }
 
+/**
+ * 对象深度合并
+ * @param target 目标对象
+ * @param source 源对象
+ * @returns T
+ */
+export const deepMerge = <T>(target: T, source: T): T => {
+    for (const key in source) {
+        const prototype = Object.prototype.toString.call(target[key]),
+            t = target[key],
+            s = source[key];
+        // 对象属性类型检查
+        switch (prototype) {
+            case '[object Object]':
+                target[key] = deepMerge(t, s);
+                break;
+            case '[object Array]':
+                if (Array.isArray(t) && Array.isArray(s)) {
+                    target[key] = t.reduce((prev, cur, i) => {
+                        const value = deepMerge(cur, s[i]);
+                        prev.push(value);
+                        return prev;
+                    }, [])
+                }
+                break;
+            default:
+                target[key] = s;
+        }
+    }
+    return target;
+}