1. 程式人生 > >typescript或javascript深拷貝Object json

typescript或javascript深拷貝Object json

typescript或javascript深拷貝Object json

Object的json物件很多時候我們需要深拷貝,我寫了兩個工具函式,供大家參考。

deepCopyObject

深拷貝一個Object物件,返回深複製的物件。

/**
* @method 深複製一個json物件
* @param source 需要深複製的物件
* @return 返回一個新的json物件
* @author vincent 2018-11-29
* @version 0.0.0
* @example
* @log 1. vincent,2018-11-29, func、date、reg 和 err 型別不能正常拷貝
*/
export function deepCopyJson(source: Object): Object {
    const newObject = {};
    for (const key of Object.keys(source)) {
        newObject[key] = typeof source[key] === 'object' ? deepCopyJson(source[key]) : source[key];
    }
    return newObject;
}

mergeObject

合併兩個物件,將dest合併到source中,修改source中的屬性值,不會修改dest中的屬性值。

/**
* @method 合併json物件,遇到相同元素級屬性,以source為準
* @param source 被合併的json物件
* @param dest json物件,將此json的屬性遞迴賦值給source
* @return void 不返還新的值而是直接改變source
* @author vincent 2018-12-01
* @version 0.0.0
* @example
* @log 1. vincent,2018-12-01,建立
*/
export function mergeJson(source: Object, dest: Object): void {
    for (const key of Object.keys(dest)) {
        if (source[key] === undefined) {  // 不衝突的,直接賦值
            source[key] = dest[key];
            continue;
        }
        // 衝突了,如果是Object,看看有麼有不衝突的屬性
        // 不是Object 則以main為主,忽略即可。故不需要else
        if (isJson(dest[key])) {
            // arguments.callee 遞迴呼叫,並且與函式名解耦
            mergeJson(source[key], dest[key]);
        }
    }
}

/**
* @method 是否是json物件
* @param target 需要被判斷的型別
* @return 如果是json物件返回 true,如果不是返回 false
* @author vincent 2018-12-01
* @version 0.0.0
* @example
* @log 1. vincent,2018-12-01,建立
*/
export function isJson(target): boolean {
    return typeof target === 'object' && target.constructor === Object;
}