JSON.stringify的简单实现

前言

几个月前碰到这个面试题,当时emm没解出来,最近有空自己试着实现了一下;(主要是百度了好久,看别人的题解要么太复杂不可以,要么随便试试就发现实现不完整),so自己动手丰衣足食

实现

思路:

  • 判断字符类型,简单类型赋值
  • 便利对象,拼接字符串,需要注意‘逗号’以及一些特殊值的处理
  • key用双引号封装,value判断是否还有子集有同样再封装,字符串用

实现:

  • 实现基本类型的处理包括 “number”, “string”, “undefined”, “null”, “boolean”
  • 实现复杂类型的处理包括 “function”, “array”, “object”

特殊处理:

  • 类型是function 解析为 undefined
  • 数组遇到undefined和function类型的解析为null,
  • 对象遇到vaule值是undefined或者类型是functioned,则不解析这一对key-value值

代码实现

let str = ""; // 注意每次调用都需要置空,应为这是个全局变量,会无限叠加滴~,后续再看看怎么去解决
function objToStr(obj) {
  let simple = "";
  /*简单值处理
  param :需要转化的值
  type:转化值的类型
  */
  function baseFunction(param, type = "base") {
    if (typeof param === "undefined") {
      simple = type === "arr" ? null : undefined;
    } else if (typeof param === "number") {
      simple = param;
    } else if (typeof param === "string") {
      simple = `"${param}"`;
    } else if (typeof param === "function") {
      simple = type === "arr" ? null : `undefined`;
    } else if (typeof param === "boolean") {
      simple = `'${param}'`;
    }
    return simple;
  }
  const type = ["number", "string", "undefined", "function", "boolean"];
  if (type.includes(typeof obj)) {
    baseFunction(obj);
  } else if (typeof obj === "object") {
    if (obj === null) {
      str += null;
    } else if (Array.isArray(obj)) {
      str += `[`;
      for (let i in obj) {
        if (typeof obj[i] === "object") {
          objToStr(obj[i]);
        } else {
          str += baseFunction(obj[i], "arr");
        }
        // 处理逗号
        i < obj.length - 1 && (str += `,`);
      }
      str += `]`;
    } else {
      str += `{`;
      for (let i in obj) {
        if (typeof obj[i] === "object") {
          str += `"${i}":`;
          objToStr(obj[i]);
        } else {
          obj[i] !== undefined &&
            typeof obj[i] !== "function" &&
            (str += `"${i}":${baseFunction(obj[i], "obj")}`);
        }
        // 处理逗号
        let arr = Object.keys(obj);
        i !== arr[arr.length - 1] &&
          obj[i] !== undefined &&
          typeof obj[i] !== "function" &&
          (str += `,`);
      }
      str += `}`;
    }
  }

  return str || simple;
}
// objToStr(["aa",{aa:function(){console.log(1)},bb:1}]);
objToStr(["aa",function () {console.log(1);},{ bb: 1 },]);
// objToStr(undefined);

其他

有更简单易懂的实现方法的友友们麻烦评论分享呀~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值