js 拷贝树copytree

希望能摆脱lodash的深拷贝

function copytree(tree, all) {
    if (all === void 0) { all = true; }
    var _tostring = function (value) { return Object.prototype.toString.call(value); };
    var emptyp = function (value) {
        return JSON.stringify(value).length === 2 ? true : false;
    };
    var treeTag = _tostring(tree);
    var objectTag = '[object Object]';
    var arrayTag = '[object Array]';
    var res = (function () {
        if (treeTag === objectTag) {
            return {};
        }
        else if (treeTag === arrayTag) {
            return [];
        }
        else {
            return tree;
        }
    })();
    if (treeTag !== objectTag && treeTag !== arrayTag)
        return res;
    if (emptyp(tree))
        return res;
    function copyTree(obj, a) {
        var objTag = _tostring(obj);
        if (emptyp(obj))
            return objTag === objectTag ? {} : [];
        var res = objTag === objectTag ? {} : [];
        var o = a ? Object.getOwnPropertyNames(obj) : obj;
        if (a) {
            for (var i in o) {
                var k = o[i];
                var value = obj[k];
                var valueTag = _tostring(value);
                if (valueTag === arrayTag || valueTag === objectTag) {
                    res[k] = copyTree(value, a);
                }
                else {
                    res[k] = value;
                }
            }
        }
        else {
            for (var k in o) {
                var value = obj[k];
                var valueTag = _tostring(value);
                if (valueTag === arrayTag || valueTag === objectTag) {
                    res[k] = copyTree(value, a);
                }
                else {
                    res[k] = value;
                }
            }
        }
        return res;
    }
    var t = all ? Object.getOwnPropertyNames(tree) : tree;
    if (all) {
        for (var i in t) {
            var k = t[i];
            var value = tree[k];
            var valueTag = _tostring(value);
            if (valueTag === arrayTag || valueTag === objectTag) {
                res[k] = copyTree(value, all);
            }
            else {
                res[k] = value;
            }
        }
    }
    else {
        for (var k in t) {
            var value = tree[k];
            var valueTag = _tostring(value);
            if (valueTag === arrayTag || valueTag === objectTag) {
                res[k] = copyTree(value, all);
            }
            else {
                res[k] = value;
            }
        }
    }
    return res;
}

调试

import {
    log as l
} from 'console';

function copytree(tree: any, all: boolean = true) {
    const _tostring = (value: any): string => Object.prototype.toString.call(value);
    const emptyp = function (value: any) {
        return JSON.stringify(value).length === 2 ? true : false;
    }
    let treeTag = _tostring(tree);
    let objectTag = '[object Object]';
    let arrayTag = '[object Array]';
    let res: any = (function () {
        if (treeTag === objectTag) {
            return {};
        } else if (treeTag === arrayTag) {
            return []
        } else {
            return tree;
        }
    })();
    if (treeTag !== objectTag && treeTag !== arrayTag) return res;
    if (emptyp(tree)) return res;

    function copyTree(obj: any, a: boolean): any {
        let objTag = _tostring(obj);
        if (emptyp(obj)) return objTag === objectTag ? {} : [];
        let res: any = objTag === objectTag ? {} : [];

        let o = a ? Object.getOwnPropertyNames(obj) : obj;

        if (a) {
            for (const i in o) {
                let k = o[i];
                let value = obj[k]
                let valueTag = _tostring(value);
                if (valueTag === arrayTag || valueTag === objectTag) {
                    res[k] = copyTree(value, a);
                } else {
                    res[k] = value;
                }
            }
        } else {
            for (const k in o) {
                let value = obj[k]
                let valueTag = _tostring(value);
                if (valueTag === arrayTag || valueTag === objectTag) {
                    res[k] = copyTree(value, a);
                } else {
                    res[k] = value;
                }
            }
        }

        return res;
    }

    let t = all ? Object.getOwnPropertyNames(tree) : tree;

    if (all) {
        for (const i in t) {
            let k = t[i];
            let value = tree[k]
            let valueTag = _tostring(value);
            if (valueTag === arrayTag || valueTag === objectTag) {
                res[k] = copyTree(value, all);
            } else {
                res[k] = value;
            }
        }
    } else {
        for (const k in t) {
            let value = tree[k]
            let valueTag = _tostring(value);
            if (valueTag === arrayTag || valueTag === objectTag) {
                res[k] = copyTree(value, all);
            } else {
                res[k] = value;
            }
        }
    }
    return res;
}

// let b = {
//     name: 'ajanuw',
//     age: 14,
//     list: [1, 2, 3, {
//         name: 'ajanuw',
//         users: ['a', 'b']
//     }]
// }

// let x = copytree(b)

// l(x)
// l(b)


// l(x === b) // false
// l(b.list === x.list)
// l(b.list[3] === x.list[3])
// l(b.list[3],  x.list[3])


let a = [1, 2, 3, { name: 'ajanuw' }]
Object.defineProperty(a, '10', {
    value: { age: 14 }
})

let b = copytree(a, false)

l(a)
l(b)

l(a === b)

猜你喜欢

转载自www.cnblogs.com/ajanuw/p/9124250.html