zoukankan      html  css  js  c++  java
  • 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 可以得到结果

  • 相关阅读:
    sudo详解
    Linux按照CPU、内存、磁盘IO、网络性能监测
    基于kickstart定制自动化安装的linux镜像系统
    基于busybox和LFS的linux系统定制
    syslog及syslog-ng详解 日志服务器
    yum报错
    二进制程序及其依赖库的移植脚本
    Linux 系统裁剪
    linux 内核手动编译
    linux rc.sysinit文件详解
  • 原文地址:https://www.cnblogs.com/me-data/p/10276788.html
Copyright © 2011-2022 走看看