2017-01-12 16 views
0

私はjsonオブジェクトを取るという仕事を与えられています(それはこれ以上は入れ子になっていないかもしれません)、それを解析して追加する関数を書いていますHTMLページ。具体的には、私はデータを取得する必要があるようなファイルを私に渡します。深さは1レベル、深さは15レベルです。私はどこから始めるべきか分かりません。私は再帰的なループをwhileループで使うべきだと知っていますが、完全に消えてしまっています。入れ子になったjsonをhtmlに変換する

正しい方向のヘルプやポインタがあれば助かります。ありがとうございます。

[ 
    { 
    "tag": "section", 
    "content": { 
     "tag": "h2", 
     "content": "Welcome to My Page!" 
    } 
    }, 
    { 
    "tag": "section", 
    "content": [ 
     { 
     "tag": "h3", 
     "content": "My Favorite Things" 
     }, 
     { 
     "tag": "ul", 
     "content": [ 
      { 
      "tag": "li", 
      "content": "<img src='http://placekitten.com/g/200/200'/>" 
      }, 
      { 
      "tag": "li", 
      "content": "<img src='http://placekitten.com/g/201/200'/>" 
      }, 
      { 
      "tag": "li", 
      "content": "<img src='http://placekitten.com/g/200/201'/>" 
      } 
     ] 
     }, 
     { 
     "tag": "p", 
     "content": [ 
      { 
      "tag": "span", 
      "content": "In short, I " 
      }, 
      { 
      "tag": "strong", 
      "content": "just love" 
      }, 
      { 
      "tag": "span", 
      "content": " kittens!" 
      } 
     ] 
     } 
    ] 
    } 
] 
+1

それが構成されているので、かなり良いアイデアを再帰。 – Candide

+0

ここにポインタがあります:オブジェクトの1つのレベルから始めて、ネスティングを忘れてください。上の構造体の最小論理単位を適切なHTML要素に変換する小さな関数を記述します。ループなし、何もありません。あなたの質問にその機能を追加してください。その関数を再利用して項目のリストをHTML要素のリストに変換する方法について考え続けてください。リストを変換できる関数があれば、リストのリストを変換する第3の関数を書く方法について考え続けてください。 – Tomalak

+0

私が思っていたことはありましたが、iveは以前は基本的な再帰の問題を抱えていました。私はこのことを理解する日があるだけで、私がこの頭で頭の中にいるかどうかは分かりません。 – DerekW

答えて

0

これはテンプレートフレームワークの仕事のようです。そこには多くのものがあり、ユーザーは値を編集できる必要があり、データを表示する必要がある場合(片方向バインディング)にはいくつかの点が優れています(使いやすい)場合もあります。

個人的には、アンギュラ(Angular1またはAngular2)のようなフレームワークを使用しています。これは、完全なフレームワークであり、多くのものを手伝ってくれるからです。それは両方とも、特にあなたがそれらに精通していなくて、jsonからいくつかのhtmlを作成する必要がある場合は、残酷かもしれないと言いました。

より簡単な解決策は、MustacheまたはHandlebarsのようなテンプレートシステムを使用することです。両方とも素晴らしいテンプレートシステムです。後者はもう一方の上に構築されます。

幸運 - 恐れるよりも楽しく、やや楽になるだろうと確信しています。あなたは再帰を述べたので、はいそれを使用しますが、フレームワークはあなたのためにそれをやらせる - レストラブルやエラーが発生しにくいが:)

0

あなたがelement.appendChild(otherelement);を使用することができるよりも (var element = document.createElement(currentLevel.tag);)あなたの記憶で要素を作成するためにdocument.createElement("tag");関数を使用それの中に何かを入れる。 typeof currentLevel.contentが "オブジェクト"か "文字列"かどうかをチェックすることで、 "コンテンツ"の種類(文字列または配列)を確認できます。

それを書いてきたら、あなたが望む要素を得るだけでなく、targetElement.appendChild(element);の中に書いてください。 あなたはしかし var HTMLcode = element.outerHTML;

2

よりも、単にHTMLコードをしたい場合はここにある:https://jsfiddle.net/ej4ftzcs/

// A recursive function to build DOM tree from a json structure 
function buildTree(tree, container) { 
    tree.forEach(function(node) { 

    var el = document.createElement(node.tag); 

    if (Array.isArray(node.content)) { 
     buildTree(node.content, el); 
    } 
    else if (typeof(node.content) == 'object') { 
     buildTree([node.content], el); 
    } 
    else { 
     el.innerHTML = node.content; 
    } 

    container.appendChild(el); 
    }); 
} 

// Run !!! 
buildTree(tree, document.body); 
+0

ありがとうございます。私はそれに似たような、しかしもっと厄介なやり方をしました。 – DerekW

+0

@DerekWなぜテンプレートフレームワークを採用しなかったのでしょうか?コードが少なく、バグも少なくても面倒ではありません.jsonからHTMLをビルドする目的で作成されたフレームワークは、何か面倒な作業を最初からやっているよりはるかに優れていますか? –

+1

@PerHornshøj-Schierbeckフレームワークを使用せずにこれを行うのは、私にとってもっと大きな学習体験だったので、私はフレームワークを使用したくありませんでした。助けてくれてありがとう!それが完了した、とその超めちゃくちゃな間、私は戻って、私は論理が考え出されたので、はるかに良い書き直すことができます知っている。 – DerekW

関連する問題