2016-07-22 28 views
0

文字列、配列、文​​字列の配列、オブジェクトの配列などのjsonオブジェクトを解析する必要があります。 1つのオブジェクトが多くの型になることは最初からうまくいきませんが、上流からコードを変更することはできません。 代わりにコードで処理する必要があります。私はjQueryやlodashを使用していないので、現代のブラウザ用のピクセルライブラリを構築しています。私は、最も近代的なブラウザをサポートしていることだし、IE> = 9文字列、オブジェクト、および配列を受け入れるJavaScript

はここ

"author": { 
"@type": "Person", 
"name": "Author" 
} 

それとも

"author":[{"@type":"Person","name":"Author"}] 

それとも

"author": 'Author' 

を返すことができるデータの例ですか

"author": ['Author', 'Author1'] 

これは私のコードです。

let obj = {}; 
    try { 
    const json = document.querySelector('div.json'); 
    if (json) { 
     let disc = JSON.parse(json.innerHTML); 
     let authors = disc.author; 

     if (typeof authors !== 'undefined' && Array.isArray(authors) && authors.length > 0) { 
     authors = authors.map((author) => { 
      if (typeof author === 'object' && author.name) { 
      return author.name; 
      } else { 
      return author; 
      } 
     }); 
     } 

     if (typeof authors !== 'undefined' && !Array.isArray(authors) && typeof authors === 'object') { 
     authors = [authors.name]; 
     } 

     if (typeof authors !== 'undefined' && typeof authors === 'string') { 
     authors = authors.split(','); 
     } 

     obj.cAu: authors.join(','); 
    } 
    } catch (e) { } 

    return obj; 

私の質問は、より効率的な方法でこれを行うには良い方法がありますか?

+3

オーバーおそらくより良い://codereview.stackexchange。 com/ – tymeJV

+1

すべてを試してみると、爆発する可能性のある部分だけ... – dandavis

答えて

1

方法について:

switch (typeof authors) { 
    case 'object': 
     if (Array.isArray(authors)) { 
      authors = authors.map((author) => { 
       if (typeof author === 'object' && author.name) { 
        return author.name; 
       } else { 
        return author; 
       } 
      }); 
     } else { 
      authors = [authors.name]; 
     } 
    break; 
    case 'string': 
     authors = authors.split(','); 
    break; 
    case 'undefined': 
     // 
    break; 
} 
1

念のために:ここでミニマリスト、まだ機能的なバージョンです。 HTTPで

JSFiddle

不要なだけでなく、予期せぬ入力に対するミニマルな保護と、言うことは

switch((Array.isArray(authors) && 1) | (typeof authors[0] == 'string' && 2)) { case 0: return [authors.name]; case 1: return [authors[0].name]; case 2: return authors.split(','); case 3: return authors; } 

...

関連する問題