2017-10-28 35 views
1

質問:以下のJSON構造を使用してcolspanを使用して動的表の行を作成するためのJqueryまたはjavascriptソリューションを探しています。私は、 必要な行を作成する問題に直面しています。私は多くのシナリオを試しましたが、THを追加するためにTRを見つけることはできません。JSONを使用した動的HTMLテーブル行の作成

お手数をおかけします。

ここに私のJSON形式ここで

[{"data":"test","nodes":[{"data":"5.00%","nodes":[{"data":"5.00%","nodes":[{"data":"Jul 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Aug 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Sep 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Oct 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Nov 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Dec 2014","nodes":[{"data":"Result","nodes":null}]}]},{"data":"70.00%","nodes":[{"data":"Jul 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Aug 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Sep 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Oct 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Nov 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Dec 2014","nodes":[{"data":"Result","nodes":null}]}]},{"data":"80.00%","nodes":[{"data":"Jul 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Aug 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Sep 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Oct 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Nov 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Dec 2014","nodes":[{"data":"Result","nodes":null}]}]}]},{"data":"5.00%","nodes":[{"data":"5.00%","nodes":[{"data":"Jul 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Aug 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Sep 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Oct 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Nov 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Dec 2014","nodes":[{"data":"Result","nodes":null}]}]},{"data":"70.00%","nodes":[{"data":"Jul 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Aug 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Sep 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Oct 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Nov 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Dec 2014","nodes":[{"data":"Result","nodes":null}]}]},{"data":"80.00%","nodes":[{"data":"Jul 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Aug 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Sep 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Oct 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Nov 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Dec 2014","nodes":[{"data":"Result","nodes":null}]}]}]}]}] 

は私がするつもりはありません、私は

enter image description here

HTML構造

<table> 
    <tr> 
    <th colspan="36">test</th> 
    </tr> 
    <tr> 
    <td colspan="18">5.00%</td> 
    <td colspan="18">5.00%</td> 
    </tr> 
    <tr> 
    <td colspan="6">5.00%</td> 
    <td colspan="6">70.00%</td> 
    <td colspan="6">80.00%</td> 
    <td colspan="6">5.00%</td> 
    <td colspan="6">70.00%</td> 
    <td colspan="6">80.00%</td> 
    </tr> 
    <tr> 
    <td colspan="1">Jul 2014</td> 
    <td colspan="1">Aug 2014</td> 
    <td colspan="1">Sep 2014</td> 
    <td colspan="1">Oct 2014</td> 
    <td colspan="1">Nov 2014</td> 
    <td colspan="1">Dec 2014</td> 
    <td colspan="1">Jul 2014</td> 
    <td colspan="1">Aug 2014</td> 
    <td colspan="1">Sep 2014</td> 
    <td colspan="1">Oct 2014</td> 
    <td colspan="1">Nov 2014</td> 
    <td colspan="1">Dec 2014</td> 
    <td colspan="1">Jul 2014</td> 
    <td colspan="1">Aug 2014</td> 
    <td colspan="1">Sep 2014</td> 
    <td colspan="1">Oct 2014</td> 
    <td colspan="1">Nov 2014</td> 
    <td colspan="1">Dec 2014</td> 
    <td colspan="1">Jul 2014</td> 
    <td colspan="1">Aug 2014</td> 
    <td colspan="1">Sep 2014</td> 
    <td colspan="1">Oct 2014</td> 
    <td colspan="1">Nov 2014</td> 
    <td colspan="1">Dec 2014</td> 
    <td colspan="1">Jul 2014</td> 
    <td colspan="1">Aug 2014</td> 
    <td colspan="1">Sep 2014</td> 
    <td colspan="1">Oct 2014</td> 
    <td colspan="1">Nov 2014</td> 
    <td colspan="1">Dec 2014</td> 
    <td colspan="1">Jul 2014</td> 
    <td colspan="1">Aug 2014</td> 
    <td colspan="1">Sep 2014</td> 
    <td colspan="1">Oct 2014</td> 
    <td colspan="1">Nov 2014</td> 
    <td colspan="1">Dec 2014</td> 
    </tr> 
</table> 
+0

あなたはJSONを受信するためのコードを持っていますか?探している機能はJSONを直接取り出してすぐにテーブルを作成するという意味ですか?これまでに何を試しましたか? –

+0

はい、JSONを直接テーブルに作成してください。私はDFSとBFSを使用して2-3のシナリオを試みましたが、私はTHを追加するためにTRを見つけることに失敗しています。 – vinod

答えて

0

これに対して再帰を使用することができます。このバージョンでは、入力に含まれている値に基づいて、colspanの値も動的に決定されます。これらは1以上の場合にのみ追加されます。colspanがゼロの場合は意味がありません。

function objectToTable(data) { 
 
    var $table = $("<table>"), 
 
     $tableRows = $("tr", $table); 
 
    
 
    function recurse(data, depth) { 
 
     if (!data) return 1; 
 
     if (depth >= $tableRows.length) { 
 
      $table.append($("<tr>")); 
 
      $tableRows = $("tr", $table); 
 
     } 
 
     var totalSpan = 0; 
 
     $tableRows.eq(depth).append(data.map(function(column) { 
 
      var colspan = recurse(column.nodes, depth+1); 
 
      // Maybe you want the deepest values to be wrapped in normal TD tags: 
 
      var $th = $(column.nodes ? "<th>" : "<td>").text(column.data); 
 
      if (colspan > 1) $th.attr("colspan", colspan); 
 
      totalSpan += colspan; 
 
      return $th; 
 
     })); 
 
     return totalSpan; 
 
    } 
 
    recurse(data, 0); 
 
    return $table; 
 
} 
 

 
var data = [{"data":"5.00%","nodes":[{"data":"Jul 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Aug 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Sep 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Oct 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Nov 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Dec 2014","nodes":[{"data":"Result","nodes":null}]}]},{"data":"70.00%","nodes":[{"data":"Jul 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Aug 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Sep 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Oct 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Nov 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Dec 2014","nodes":[{"data":"Result","nodes":null}]}]},{"data":"80.00%","nodes":[{"data":"Jul 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Aug 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Sep 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Oct 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Nov 2014","nodes":[{"data":"Result","nodes":null}]},{"data":"Dec 2014","nodes":[{"data":"Result","nodes":null}]}]}]; 
 
$("body").append(objectToTable(data));
table { 
 
    border-collapse: collapse; 
 
} 
 
th, td { 
 
    border: 1px solid; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

ありがとうTrincot!これは素晴らしいことですが、このコードは正常に動作しています。 – vinod

0

を達成しようとしています何ですJSFiddleのアイデアを参考にしてくださいあなたはこれをどうやってやることができますか?私は、クリックされたヘッダーに基づいて列を並べ替える非常に簡単な方法も含めました。このテーブルをレンダリングするために私がここで行ったことを理解した後で、プログラムによって列スパンを追加することはあまり難しくありません。それを行う方法については、document.getElementById()。setAttribute(attributeName、value)を見てください。

https://www.w3schools.com/jsref/met_element_setattribute.asp

ご質問があれば、私に教えてください:)

https://jsfiddle.net/cxb7h2ze/7/

HTML

<table> 
<thead> 
    <tr> 
    <th onclick="column(0)"> 
     Column 1 
    </th> 
    <th onclick="column(1)"> 
     Column 2 
    </th> 
    </tr> 
</thead> 
<tbody id="table"> 

</tbody> 
</table> 

<button onclick="renderArray()"> 
Render Array 
</button> 
</button> 

JS

array = [ 
    {column1: "Alphabetical name", 
    column2: 2}, 
    {column1: "Couch Potato", 
    column2: "3"}, 
    {column1: "Blah Blah", 
    column2: 1}, 
]; 

var toggle = [0,0] 
window.renderArray = function() { 
    var x; 
    var tr; 
    var td; 
    var text; 
    var button; 
    var table = document.getElementById("table"); 
    // reset table so it doesn't append a duplicate set 
    table.innerHTML = ""; 
    for (x = 0; x < array.length; x++) { 
    // create a row 
    tr = document.createElement("tr"); 
    tr.setAttribute("ondblclick", "alert('hello there this is row')"); 
    // create a cell 
    td = document.createElement("td"); 
    // create text to go in cell 
    text = document.createTextNode(array[x].column1); 
    // append text to cell 
    td.appendChild(text); 
    //append cell to row 
    tr.appendChild(td); 
    // create a second cell 
    td = document.createElement("td"); 
    // create a new text to go in cell 
    text = document.createTextNode(array[x].column2); 
    // append text to cell 
    td.appendChild(text); 
    // append cell to row 
    tr.appendChild(td); 
    // create cell 
    td = document.createElement("td"); 
    // add row to column 
    table.appendChild(tr); 
    } 
} 

window.column = function(id) { 
    toggle[id]++; 
    if (id == 0) { 
    // first column 
    array.sort(function(a, b) { 
     if (toggle[id] % 2 == 0) { 
     return a.column1.toLowerCase() < b.column1.toLowerCase(); 
     } 
     else { 
     return a.column1.toLowerCase() > b.column1.toLowerCase(); 
     } 
    }) 
    } 
    else { 
    array.sort(function(a, b) { 
     if (toggle[id] % 2 == 0) { 
     return a.column2 < b.column2; 
     } 
     else { 
     return a.column2 > b.column2; 
     } 
    }) 
    } 
    renderArray(); 
} 
関連する問題