天天看点

js/ts 实现对象深度克隆

自己实现了一个对象深度克隆:

主要缺陷只有一个:

  • 对键值为循环调用的对象无能为力,会堆栈溢出。

作用:

适合常规的纯数据对象深度克隆。

删掉类型后,js就可以直接跑

Array.prototype.o_entries = function (type, fn) {
    return Array.prototype[type].call(this, x => fn.call(x, x[0], x[1]))
}
Object.fromEntries =
    Object.fromEntries ||
    function(arr: o_entries) {
        let obj = {}
        arr.o_entries("map", (a, b) => {
            obj[a] = b
        })
        return obj
    }
Object.type = (obj) => Object.getPrototypeOf(obj).constructor.name
function clone(o: any, record = [o]) {
    switch (Object.type(o)) {
        case "Array":
            return o.map(x => clone(x));
        case "Object":
            return Object.fromEntries(
                Object.entries(o).o_entries("map", (a, b) => [a, clone(b, record)])
            );
        default:
            return o;
    }
}
           

正在解决循环调用的对象问题,解决完会更新。