【JSON】JSON.stringify 循环对象字符串化 解决方案

文章目录

说明

JSON.stringify无法字符串化带循环的对象
我计划把循环的地方替换为循环了的对象的路径

const obj = { a: 1, b: 2, c: { d: 1} }
obj.repeat = obj;
obj.c.repeat = obj.c;
这个obj是典型的成环对象
且在obj.repeat与obj obj.c.repeat与obj.c处循环了
我希望对其进行stringify后变成
{ a: 1, b: 2, c: { d: 1, repeat: ".c"}, repeat: ""}
表达
obj.c.repeat == 'c' // 对象.c
obj.repeat == '' // 也就是对象本身
即循环处会标识出于什么地方重复了
代码:

代码

const replaceLoop = ( () => {
    let checkedMap, checkPath; 
    // Map 记录对象内每个值对应的路径
    // Path 记录当前遍历到的路径
    function checkLoop(obj){
        const copyObj = Object.create(Object.getPrototypeOf(obj));
        // 保留原型 不过实际上没什么影响
        if( checkedMap.has(obj) ){ // 出现环
            return checkedMap.get(obj).join('.');  // 返回环路径
        } else {
            checkedMap.set(obj, [...checkPath]); 
            // 添加当前值对应路径 使用拷贝来确保不互相影响 
            // 字符串数组只需要单层拷贝
        }
        for(const [ key, val ] of Object.entries(obj) ){ 
            if(!val){ copyObj[key] = val; continue;}
            // 如果值相当于False 则不太可能成环 undefined不保留
            if(typeof(val) === "object"){ // 如果值很可能成环
                checkPath.push(key); // 进入 组装路径
                copyObj[key] = checkLoop(val); // 进行递归
                checkPath.pop(); // 出路径
            }else{ // 可能是函数,无法在stringify下保留
                   // 但我希望保留值,所以加toString
                copyObj[key] = val.toString(); 
            }
        }
        return copyObj;
    }
    function doReplace(obj){ 
        // 使用额外的函数进行遍历初始化
        checkedMap = new Map();
        checkPath = [];
        return checkLoop(obj);
    }
    return doReplace; // 使用闭包避免变量污染
})()

在这里插入图片描述
至少看起来大致没问题,不过剩下的你们测测看吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值