Stringify

recreate JSON stringify

by Augustus Yuan

HTML

<div id="result">

</div>

JavaScript

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify
// JSON.stringify({});                  // '{}'
// JSON.stringify(true);                // 'true'
// JSON.stringify('foo');               // '"foo"'
// JSON.stringify([1, 'false', false]); // '[1,"false",false]'
// JSON.stringify({ x: 5 });            // '{"x":5}'
// JSON.stringify({ ... });

// console.log(JSON.stringify({ x: 'lol', y: "lol" })); // { "": "" }
// JSON.stringify('hello') // "hello"

function stringify(data, stringWrapper = '"') {
  var string = "";
  if (typeof data === "string") {
    return stringWrapper + data + stringWrapper;
  } else if (typeof data === "number") {
    return data;
  } else if (typeof data === "boolean") {
    return '' + data;
  } else if (Array.isArray(data)) {
      // [{1}, [2, 3]] => 1,2,3
      return stringArrayBuilder(data);
  } else if (typeof data === "object" && data) {
    return stringObjectBuilder(data);
  } else if (!data) {
    if (typeof data === "object") {
      return 'null';
    }
  	return '';
	}
}

// handles building arrays and nested arrays
function stringArrayBuilder(data) {
  // move logic to determine if array or object
  var string = '[';
  for (var i=0; i<data.length; i++) {
    string += stringify(data[i]);
    if (i !== data.length-1) {
      string += ','
    }
  }
  string += ']';
  return string;
}

function stringObjectBuilder(data) {
  if (data.toString() === '[object Object]') {
    var string = '{';
  var keys = Object.keys(data);
  for (var i=0; i < keys.length; i++) {
      string += stringify(keys[i]) + ':' + stringify(data[keys[i]])
      if (i !== keys.length-1) {
        string += ','
      }
    }
    string += '}';
    return string;
  }
  return data.toString();
}

stringify({ test: true }); // => '{test:true}'

var obj = {};
document.getElementById('result').innerHTML = stringify([new Number(3), new String('false'), new Boolean(false)]);