使用JSON.stringify字段丢失,js改写对象转字符串方法

534 阅读1分钟
// 对象转字符串(不丢失对象方法)
  objectToString(obj, fun) {
    // 返回一个将对象中的函数都转化为字符串的对象 不直接在原对象上面改
    const stringifyFunction = (obj) => {
      let newobj = JSON.parse(JSON.stringify(obj))
      for (let key in obj) {
        if (obj[key] instanceof Function) {
          newobj[key] = obj[key].toString().replace(/[\n\t]/g, '')
          continue
        }
        if (obj[key] instanceof Object) {
          newobj[key] = stringifyFunction(obj[key])
        }
      }
      return newobj
    }
    // 用于替代JSON.stringify函数
    let _object = stringifyFunction(obj) // 将对象中的函数转为字符串
    return JSON.stringify(_object) // 将对象转为字符串
  },
// 字符串转对象(不丢失对象方法)
  stringToObject(string) {
    const stringToFunction = (obj) => {
      // 将对象中的函数字符串转化为函数
      var regex = /^((functon\s)|.)([a-zA-Z_][a-zA-Z0-9_]*)\(.*\)\s\{.*\}/ //匹配函数字符串
      for (let key in obj) {
        if (obj[key] instanceof Object) {
          stringToFunction(obj[key])
        } else {
          if (regex.test(obj[key])) {
            // 是一个函数
            try {
              let params = obj[key].substring(
                obj[key].indexOf('(') + 1,
                obj[key].indexOf(')')
              )
              let operation = obj[key].substring(
                obj[key].indexOf('{') + 1,
                obj[key].length - 1
              )
              obj[key] = new Function(params, operation)
            } catch (e) {
              console.log(e)
            }
          }
        }
      }
      return obj
    }
    // 用于替代JSON.parse
    let obj = JSON.parse(string) //将字符串转为对象
    return stringToFunction(obj) // 将对象中的函数字符串转为函数
  }