• js对象序列化


    JSON.stringify和JSON.parse()不能解析出循环的对象 如 

    var tem={a:2,b:2}

    tem.c=tem;

    这个时候JSON.parse会解析成 {'a':2,'b':2,'c':null}

    有时候又想要这个对象 那怎么办喃?

    var obj = {
        a: 1,
        b: 2,
        d:{a:1,b:3}
    }
    //不拷贝原型链
    obj.c = obj;
    obj.d.c=obj.c;
    var getList = function(obj) {
        var me = this;
        me.list = [];
        me.obj = me.copy(obj);
        me.deal();
    }
    getList.prototype = {
        constrctor: getList,
        copy(obj) {
            var me = this;
            if (typeof obj !== 'object')
                return obj
            var result = me.list.filter(i => i.v === obj);
            if (result.length) {
                return result[0].index;
            }
            me.list.push({ v: obj, index: me.list.length + '$crucle' });
            var re;
            var test = {}.toString.call(obj);
            if (test === '[object Object]') {
                re = {};
                Object.keys(obj).forEach(i => {
                    re[i] = me.copy(obj[i]);
                });
                return re;
            }
            if (test === '[object Array]') {
                re = obj.map(i => {
                    return me.copy(i);
                });
                return re;
            }
        },
        deal() {
            var me = this;
            me.list.forEach(i => {
                me.cut(i.v);
            });
        },
        cut(obj) {
            var me = this;
            var test = {}.toString.call(obj);
            if (test === '[object Array]') {
                obj.forEach(i => {
                    if (me.doCut(i)) {
                        me.cut(i);
                    } else {
                        return;
                    }
                });
            }
            if (test === '[object Object]') {
                Object.keys(obj).forEach(i => {
                    if (me.doCut(obj[i])) {
                        me.cut(obj[i]);
                    } else {
                        return;
                    }
                })
            }
        },
        doCut(obj) {
            var me = this;
            var result = me.list.filter(i => i.v === obj)
            if (result.length) {
                obj = result[0].index;
                return false;
            }
            return true;
        }
    }
    var result = new getList(obj);
    result.list.forEach(i => {
        i.v = null;
    });
    var str = JSON.parse(JSON.stringify(result));
    // console.log(str);
    var getObj = function(obj) {
        var me = this;
        me.old = obj.list;
        me.list = [];
        me.getOld(obj.obj);
        me.list.forEach(i => {
            me.reverseOld(i.v);
        });
        return obj.obj;
    }
    getObj.prototype = {
        constructor: getObj,
        regexp:/crucle$/ig,
        getOld(obj) {
            var me = this;
            if (typeof obj !== "object")
                return;
            me.list.push({ index: me.list.length + '$crucle', v: obj });
            var test = {}.toString.call(obj);
            if (test === '[object Object]') {
                Object.keys(obj).forEach(i => {
                    me.getOld(obj[i]);
                });
                return;
            }
            if (test === '[object Array]') {
                obj.forEach(i => {
                    me.getOld(i);
                })
            }
        },
        reverseOld(obj) {
            var me = this;
            var test = {}.toString.call(obj);
            if (test==='[object Object]'){
                Object.keys(obj).forEach(i=>{
                    var regexp=/crucle$/ig;
                    if(typeof obj[i]==='string'&&regexp.test(obj[i])){
                        var re=me.list.filter(j=>j.index===obj[i])[0];
                        obj[i]=re.v;
                        return ;
                    }else{
                         if (typeof obj === 'object')
                             me.getOld(i);
                    }
                })
            }
        }
    }
    var reverse=new getObj(str);
    console.log(reverse);

    没有拷贝原型链和函数对象 可以使用function.toString() 然后 使用 eval 可以得到结果

  • 相关阅读:
    开发和使用自定义服务器控件
    用户认证管理设计方案(转)
    用 @@ERROR 检测几条语句的成功
    在 ASP.NET 中支持数据库缓存相关性
    给新人程序员的八点建议(转)
    DataTable添加列
    各城市工资多少才等于北京5000元工资的生活?
    连续读取区块应用程序设置值
    VS2005 SP1发布,解决只能创建WebSite,无法创建Web Application项目的问题 (转)
    帮你免于失业的十大软件技术
  • 原文地址:https://www.cnblogs.com/me-data/p/10276788.html
Copyright © 2020-2023  润新知