🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

943閲覧

JQUERYでJSONデータ→TREEリストについて

yuujiMotoki

総合スコア90

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2021/01/15 06:26

#やりたいこと

下記のようなJSONデータがあり、親子関係からリストを作成したい。

データ

input

1const data = eval( 2{ 3"1": {"H10": "CAP", "H20": "GR", "H30": "GR-TC", "H40": "GR01TC", "Strategy": "11AA"}, 4"2": {"H10": "CAP", "H20": "GR", "H30": "GR-TC", "H40": "GR02TC", "Strategy": "11AB"}, 5"3": {"H10": "CAP", "H20": "GR", "H30": "GR-TC", "H40": "GR03TC", "Strategy": "11AC"} 6}

アウトプット

下表のように共通キーを一つの親にして、階層をリスト化したい

data

1□CAP 2 □GR 3   □GR-TC 4    □GR01TC 5    □GR02TC 6    □GR03TC

#現状
下記のように、キーをリストとして、itemに入れて回しています。
親子関係は階層の深さDEPTHを使って表しています。

#やりたいこと
子の要素の際に、<UL></ul>で要素を括りたい
appendTo で親要素に<ul>を付けていますが、うまくいかない

#質問
JqueryでDEPTHの深さに応じて、要素そのものを<ul>で括り、インデントを下げて表示をしたい。
すみませんが、jqueryに不慣れですので、教えてください。

js

1 for(j=0;j<depth;j++){ 2 $parentUL = $('<ul>', { 3// style: 'display: none'// 4 }).appendTo($item); 5 }

JavaScript

1<script type='text/javascript'> 2 3const data = eval({{df|tojson|safe}}); 4 5function addItem(parentUL, branch) { 6 var buf=[]; 7 for (i=1;i<Object.keys(branch).length;i++){ 8 depth =0; 9 for (var item in branch[1]) { //loop of key value 10 switch(i){ 11 case 1: 12 buf[item]=branch[i][item] //init value 13 addhtml(parentUL,i,branch[i][item],depth); 14 break; 15 16 default: 17 if (branch[i][item]==buf[item]){ 18 break; 19 } 20 } 21 depth=depth+1; 22 } 23} 24} 25 26function addhtml(parentUL,i,text,depth){ 27 $item = $('<li>', { 28 id: "item" + i 29 }); 30 $item.append($('<input>', { 31 type: "checkbox", 32 id: "item" + i, 33 name: "item" + i 34 })); 35 $item.append($('<label>', { 36 for: "item" + i, 37 text: text 38 })); 39 for(j=0;j<depth;j++){ 40 $parentUL = $('<ul>', { 41// style: 'display: none'// 42 }).appendTo($item); 43 } 44 parentUL.append($item); 45} 46 47$(document).ready(function () { 48 addItem($('#root1'), data); 49 $(':checkbox').change(function () { 50 $(this).closest('li').children('ul').slideToggle(); 51 }); 52 $('label').click(function(){ 53 $(this).closest('li').find(':checkbox').trigger('click'); 54 }); 55}); 56</script> 57 58

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/01/15 06:28

html で静的イメージ(モック)は作ってみましたか? それができてないと動的に作るのは難しいかと思います。
guest

回答1

0

ベストアンサー

階層を扱う場合、再帰処理(関数内で自分自身を呼び出してループする処理)で書くと、慣れない内は難しいかもしれないですが、最終的にはそのほうがスッキリ書けます。(というか、再帰で書かないとグチャグチャになります)

javascript

1<ul id="root1"></ul> 2<script type='text/javascript'> 3const maxDep = 4 4const tree = {}; 5 6const data = eval({ 7 "1": {"H10": "CAP", "H20": "GR", "H30": "GR-TC", "H40": "GR01TC", "Strategy": "11AA"}, 8 "2": {"H10": "CAP", "H20": "GR", "H30": "GR-TC", "H40": "GR02TC", "Strategy": "11AB"}, 9 "3": {"H10": "CAP", "H20": "GR", "H30": "GR-TC", "H40": "GR03TC", "Strategy": "11AC"} 10}); 11 12// データの整形 13function maketree(row, dep) { 14 let target = tree; 15 16 for (let i = 0; i <= dep; i++) { 17 const k = Object.keys(row)[i]; 18 if (row[k] in target) { 19 target = target[row[k]]; 20 } else { 21 target[row[k]] = {} 22 } 23 } 24 25 if (dep == maxDep) return; 26 maketree(row, dep + 1); // 再帰 27} 28 29// HTML出力 30function output(ob, $ul) { 31 Object.keys(ob).forEach(key => { 32 33 const $li = $("<li>"); 34 $li.append("<input type='checkbox'>"); 35 $li.append($("<label>").html(key)) 36 $ul.append($li); 37 38 // 子がいるなら 39 if (Object.keys(ob[key]).length > 0) { 40 const $nestUl = $("<ul>"); 41 $li.append($nestUl); 42 output(ob[key], $nestUl); // 再帰 43 } 44 }); 45} 46 47Object.keys(data).forEach(i => { 48 maketree(data[i], 0); 49}); 50 51$(document).ready(function () { 52 53 output(tree, $("#root1")); 54 55 $(':checkbox').change(function () { 56 $(this).closest('li').children('ul').slideToggle(); 57 }); 58 $('label').click(function(){ 59 $(this).closest('li').find(':checkbox').trigger('click'); 60 }); 61}); 62<script>

投稿2021/01/15 09:50

編集2021/01/15 10:06
umau

総合スコア831

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuujiMotoki

2021/01/15 13:36

ありがとうございます。 Treeというデータ構造を最初に作り、次にHTML化されているのですね。 まだソースコードと動きを解読することができていませんが、 どちらも再帰の処理が加えられていて、自分で追いかけてみて勉強してみます。 この処理が書けずに、ずいぶん時間がかかってしまいましたが この度は、ご提案いただき大変助かりました。 どうもありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問