Implementing Mozilla's toSource() method in Internet Explorer

后端 未结 8 907
轮回少年
轮回少年 2020-11-27 07:41

Has anyone implemented Mozilla\'s Object.toSource() method for Internet Explorer and other non-Gecko browsers? I\'m looking for a lightweight way to serialize simple object

8条回答
  •  天命终不由人
    2020-11-27 07:46

    See also JavaScript data formatting/pretty printer. I think the routine exports in valid JS format, so it can be eval to get it back.

    [EDIT] Actually, not! It is OK for quick dump but not for real serialization. I improved it, result below:

    function SerializeObject(obj, indentValue)
    {
      var hexDigits = "0123456789ABCDEF";
      function ToHex(d)
      {
        return hexDigits[d >> 8] + hexDigits[d & 0x0F];
      }
      function Escape(string)
      {
        return string.replace(/[\x00-\x1F'\\]/g,
            function (x)
            {
              if (x == "'" || x == "\\") return "\\" + x;
              return "\\x" + ToHex(String.charCodeAt(x, 0));
            })
      }
    
      var indent;
      if (indentValue == null)
      {
        indentValue = "";
        indent = ""; // or " "
      }
      else
      {
        indent = "\n";
      }
      return GetObject(obj, indent).replace(/,$/, "");
    
      function GetObject(obj, indent)
      {
        if (typeof obj == 'string')
        {
          return "'" + Escape(obj) + "',";
        }
        if (obj instanceof Array)
        {
          result = indent + "[";
          for (var i = 0; i < obj.length; i++)
          {
            result += indent + indentValue +
                GetObject(obj[i], indent + indentValue);
          }
          result += indent + "],";
          return result;
        }
        var result = "";
        if (typeof obj == 'object')
        {
          result += indent + "{";
          for (var property in obj)
          {
            result += indent + indentValue + "'" +
                Escape(property) + "' : " +
                GetObject(obj[property], indent + indentValue);
          }
          result += indent + "},";
        }
        else
        {
          result += obj + ",";
        }
        return result.replace(/,(\n?\s*)([\]}])/g, "$1$2");
      }
    }
    

    indentValue can be null, "", " ", "\t" or whatever. If null, no indentation, output a rather compact result (could use less spaces...).

    I could use an array to stack the results then join them, but unless you have giant objects, string concatenation should be good enough...
    Also doesn't handle cyclic references...

提交回复
热议问题