Ver código fonte

对象合并优化

li.shaoyi 3 anos atrás
pai
commit
d93ec50cf6
1 arquivos alterados com 23 adições e 20 exclusões
  1. 23 20
      src/utils/objHandle/index.ts

+ 23 - 20
src/utils/objHandle/index.ts

@@ -76,27 +76,30 @@ export function objectToUint8Array(data: object | string) {
  * @param source 源对象
  * @returns
  */
-export const deepMerge = <T>(target: T, source: T): T => {
+export function 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;
+        // 判断属性是否存在
+        if (Object.prototype.hasOwnProperty.call(target, key)) {
+            const t = target[key];
+            const s = source[key];
+
+            // 对象属性类型检查
+            switch (Object.prototype.toString.call(t)) {
+                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;