StringifyJSON(実験)



src/stringifyJSON.jsでstringfyJSON関数を直接実装しspecテストに合格した.

n/a.ターゲット

  • Browserに存在するJSON.stringfy関数を直接実現します.
    JSON.stringfy関数は入力値をJSON形式に変換します.
    ただしundefinedとfunctionはJSONまたはnullに省略される.
  • StringfyJSONの動作原理は以下の通りである.
  • Booleanを入力として
    stringifyJSON(true); //'true'
  • Stringを入力として
    stringifyJSON('foo'); //'"foo"'
  • アレイを入力として
    stringifyJSON([1, 'false', false]);//'[1,"false",false]'
  • オブジェクトを入力として使用します.
    stringifyJSON({ x: 5 }); //'{"x":5}'
  • は定義されていません.関数が与えられた場合
    stringifyJSON(undefined) //undefined
    stringifyJSON(function(){}) //undefined
    stringifyJSON({ x: undefined, y: function(){} }) //'{}'

  • spec/stringifyJSONSpec.jsのstringfiableObjects配列を参照して、テストでどの入力値を渡す必要があるか、stringfilyを考慮してください.

  • テストに合格したいだけなら、次のようなことを実施できます.
    const stringifyJSON = JSON.stringify;
  • に答える


    stringfyJSON関数は、オブジェクトを文字列に変換して転送するシリアル化関数です.
    (1)typeofメソッドで入力値のタイプを区別して結果値を取得する必要がある.
    (2)文字boolean数値配列オブジェクトの場合、配列オブジェクトが含まれている場合は、再帰関数で文字列として作成し、配列またはオブジェクトが含まれている場合に文字列として作成する必要があります.
    ✓オブジェクトは文字列「9」に変換する必要があります
      if (typeof obj === "number"){
        return String(obj);
      }
    ✓オブジェクトは文字列「null」に変換する必要があります
     if(obj === null){
        return "null";
      }

  • typeof obj==「null」ができない理由:オブジェクトとしてキャプチャされます.

  • ✓オブジェクトは文字列「true」に変換する必要があります
    ✓オブジェクトは文字列「false」に変換する必要があります
    if(typeof obj === "boolean"){
        return String(obj);
      }
    ✓オブジェクトは文字列「Hello world」に変換する必要があります
      if(typeof obj === "string"){
        return `"${obj}"`
      }
    ✓オブジェクトは文字列[]に変換する必要があります
    ✓オブジェクトは文字列「[8]」に変換する必要があります.
    ✓オブジェクトは文字列「」に変換する必要があります[hi]
    ✓オブジェクトは文字列"[8,hi"に変換する必要があります
    ✓オブジェクトは文字列"[1,0,-1,-0.3,0.3134.3233345,0.0001199999]に変換する必要があります.
    ✓オブジェクトは文字列「[8,[],3,4]」に変換する必要があります.
    ✓オブジェクトは文字列[[[[]foo]]に変換する必要があります.
      if(Array.isArray(obj)){
        let newArr = [];
        obj.forEach(function (ele){
          newArr.push(stringifyJSON(ele))
        })
        return `[${newArr}]`
      }

  • forEachメソッドリンク
    ->メソッドによって配列内の要素を1つずつドラッグします.
    ->pushメソッドとstringfyJSON再帰関数で空の配列を再挿入します.

  • Bannaスタイルのテンプレートリフト[${}]
  • let newArr2 = [1, 3, 4]
    undefined
    let a = '9' 
    undefined
    newArr2.push(a)
    4
    newArr2
    (4) [1, 3, 4, '9']
    // 여기서 템플릿 리터널을 쓰면 안에는 숫자와 문자열로 바뀐다.
    `[${newArr2}]`
    '[1,3,4,9]'

  • 新しい方法

  • ✓オブジェクトは文字列"{}"に変換する必要があります
    ✓オブジェクトは文字列"{":"apple"}に変換する必要があります.
    ✓オブジェクトは、文字列"{"foo:true、[bar]:false、[baz]:null}に変換する必要があります.
    ✓オブジェクトは文字列"{"boolean,true:true,"boolean,false":false,"null":null}に変換する必要があります.
    ✓オブジェクトは文字列"{":{"b":"c"}に変換する必要があります.
    ✓オブジェクトは文字列"{":"b","c"}に変換する必要があります.
    ✓オブジェクトは、文字列[]:[a]:[b]}、[c]:[d]}]に変換する必要があります.
    ✓オブジェクトは文字列"{":[]、「c」:{}、「b」:true}に変換する必要があります.
    ✓関数と未定義の文字列は存在しません.
      if(typeof obj === "object"){
        let result = "";
        for(let key in obj) {
          if(obj[key] === undefined || typeof obj[key] === "function"){
             result = String(result);
          } else {
            result += `${stringifyJSON(key)}:${stringifyJSON(obj[key])},`;
          }
        }
        result = result.substr(0, result.length -1);
        return `{${result}}`
      }

  • substrメソッド関連リンク

  • object(オブジェクト)を直接文字で表すと、object objectはこのように現れます.

  • 結果コード

    function stringifyJSON(obj) {
      if(obj === null){
        return "null";
      }
      if (typeof obj === "number"){
        return String(obj);
      }
      if(typeof obj === "boolean"){
        return String(obj);
      }
      if(typeof obj === "string"){
        return `"${obj}"`
      }
      if(Array.isArray(obj)){
        let newArr = [];
        obj.forEach(function (ele){
          newArr.push(stringifyJSON(ele))
        })
        return `[${newArr}]`
      }
      if(typeof obj === "object"){
        let result = "";
        for(let key in obj) {
          if(obj[key] === undefined || typeof obj[key] === "function"){
             result = String(result);
          } else {
            result += `${stringifyJSON(key)}:${stringifyJSON(obj[key])},`;
          }
        }
        result = result.substr(0, result.length -1);
        return `{${result}}`
      }
    
    
      // your code goes here
    };
    ソース:コードステータス