質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.46%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

585閲覧

一つのJavaScriptを使いまわして、複数のjsonファイルからデータを読み取り、HTMLの複数のidセレクタにテーブルを表示したい。

urk_mofmof

総合スコア3

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2023/11/07 15:38

実現したいこと

  • 複数のjsonファイルから複数のテーブルを作成する

例えば、List1.jsonの内容を<div id="List1">に、List2.jsonの内容を<div id="List2">に、というようなことを実現したいです。
jsonファイルは今後も増える予定です。
その際ほぼ同じ内容のJavaScriptをたくさん増やしたくはないので、できれば1つのJavaScriptを使いまわしたいです。

質問

こちらのサイトを参考に一つのファイルから一つのテーブルを作成することはできましたが、どちらも数を増やすと失敗してしまいます。

現在、上記サイトにあるJavaScriptを参考にして作ったスクリプトを使っているのですが、このスクリプトで読み込んでいるjsonファイルと出力先のidセレクタを、どうにかして使いたいjsonファイルに合わせて変えられないかなと考えています。

実現したいことに書いた通り、ほぼ同じ内容のJavaScriptを何個も増やしたくないです。
それでもjsonとidだけ変更して、増やしたいテーブルの数だけJavaScriptを増やさなければならないでしょうか?
何か方法があれば教えていただきたいです。

該当のソースコード

HTML

1<div class="flex_test-box"> 2 <div class="flex_test-item"> 3 <div> 4 <!-- ここに表示したい --> 5 <div id="List1"></div> 6 </div> 7 </div> 8</div> 9<div class="flex_test-box"> 10 <div class="flex_test-item"> 11 <div> 12 <!-- ここに表示したい --> 13 <div id="List2"></div> 14 </div> 15 </div> 16</div>

JavaScript

1$(function (){ 2 $.getJSON('List1.json', function(data) 3 { 4 var src = data.map(function(i) 5 { 6 return '<tr class="' + i.class + '">' + 7 '<td>' + i.button + '</td>' + 8 '<td>' + i.song + '</td>' + 9 '</tr>'; 10 }) 11 .join(''); 12 13 src = '<table>' + src + '</table>'; 14 $( '#List1' ).append(src); 15 }); 16});

試したこと

  • HTMLにdataを書いてJavaScriptから取得して使う方法

HTML

1<div data-id="table" 2 data-file="List1.json" 3 data-List="#List1">

として、JavaScriptからファイル名と出力するidセレクタを取得し、代入して使用しました。
一つの時はうまくいきましたが、数を増やすとdata-idが重複してしまうため失敗しました。

  • 配列とfor文を使う方法

JavaScript

1var List = [ 2 { 3 FileName: 'List1.json', 4 Space: '#List1' 5 }, 6 { 7 FileName: 'List2.json', 8 Space: '#List2' 9 } 10]; 11 12$(function (){ 13 for(var i = 0; i < List.length; i++) 14 { 15 $.getJSON(List[i]['FileName'], function(data) 16 { 17 var src = data.map(function(i) 18 { 19 return '<tr class="' + i.class + '">' + 20 '<td>' + i.button + '</td>' + 21 '<td>' + i.song + '</td>' + 22 '</tr>'; 23 }) 24 .join(''); 25 26 src = '<table>' + src + '</table>'; 27 $( '#List' + i ).append(src); 28 }); 29 } 30});

配列のi番目を使ってどうにかできないかと考えました。
この方法ではList1.jsonとList2.jsonの内容を全て#List1に表示してしまい失敗します。
その際、データの個数はあっているのですが、1つ目のファイルだけ全て正常に読み取れ、2つ目以降のファイルはデータが全てundefinedになっています。

$( '#List' + i ).append(src);

は本来

$( List[i]['Space'] ).append(src);

としていましたが、表示すらできなくなるので現在の形にしています。

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

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

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

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

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

guest

回答2

0

ベストアンサー

HTMLにdataを書いてJavaScriptから取得して使う方法

については、コードが書いてないので、考えてませんが、

配列とfor文を使う方法

この方法ではList1.jsonとList2.jsonの内容を全て#List1に表示してしまい失敗します。

は、getJSONに引数で渡している「テーブルを作る無名関数」は、JSONファイルを取得した後で実行されるわけですが、その前に13行目からのforループは進んでしまい、「テーブルを作る無名関数」が実行される時点でiはすでに2になっています。

解決方法はいろいろありますが、「テーブルを作る処理」がループの中に埋め込まれていて見にくいこともあり、それを関数として独立させるのが簡単でしょう。

JavaScript

1var List = [ 2 { 3 FileName: 'List1.json', 4 Space: '#List1' 5 }, 6 { 7 FileName: 'List2.json', 8 Space: '#List2' 9 } 10]; 11function make_table(url,id){ 12 $.getJSON(url, function(data){ 13 var src = data.map(function(i){ 14 return '<tr class="' + i.class + '">' + 15 '<td>' + i.button + '</td>' + 16 '<td>' + i.song + '</td>' + 17 '</tr>'; 18 }) 19 .join(''); 20 21 src = '<table>' + src + '</table>'; 22 $( id ).append(src); 23 }); 24} 25 26$(function (){ 27 for(var i = 0; i < List.length; i++) 28 { 29 make_table(List[i].FileName, List[i].Space); 30 } 31});

これだと27行目のiの値がどうなっていようが、関数の実行に関係ないので、大丈夫です。

他にも「クロージャー」を使う方法などが考えられます。

投稿2023/11/07 16:45

otn

総合スコア84798

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

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

CTRL-S

2023/11/07 17:33

jQuery的に処理するなら $.each(List, function(index, obj) { //obj.FileNameobj.Space を使って処理 }); とするのがいいと思います。
otn

2023/11/08 03:48 編集

「質問文のコードはさておき、どのように書くのが良いか」でなく「質問のコードのどこに問題点があり、どう直せば良いか」という回答なので、問題点以外はできるだけそのままで。 どちらも大事だと思うので、今回、両方の観点の回答が付いたので、良かったと思います。 私も「質問文のコードをどう直せば良いか」という回答だけが付いているときに「質問文のコードはさておき、どのように書くのが良いか」という回答を追加することもあります。
CTRL-S

2023/11/08 03:19

確かに、質問のコードの何が原因なのか省略しがちです・・・ それを理解しないと、また繰り返しちゃいますね。 今回のケースは非同期処理にありがちなミスなんですが、説明すると長くなっちゃうからついつい省略してしまいます。
urk_mofmof

2023/11/09 02:17

お二人ともありがとうございます! 無事動かすことができました。 まだまだ勉強途中のため、両方の観点から回答を頂けてとても勉強になりました! CTRL-Sさんのコードだと今後楽になるので今はそちらを使わせて頂いてますが、この質問でのコードの改善点+コメント欄により良い書き方の考え方が付いたこちらの回答を今回はベストアンサーにさせていただきます
guest

0

JavaScriptにファイル名とかを記述すると追加した時にJavaScriptの変更が必要になるのでHTMLにデータ属性として指定する方がいいと思います。

HTML

1<div class="flex_test-box"> 2 <div class="flex_test-item"> 3 <div> 4 <!-- ここに表示したい --> 5 <div data-file="List1.json"></div> 6 </div> 7 </div> 8</div> 9<div class="flex_test-box"> 10 <div class="flex_test-item"> 11 <div> 12 <!-- ここに表示したい --> 13 <div data-file="List2.json"></div> 14 </div> 15 </div> 16</div>

JavaScript

1$(function (){ 2 $('[data-file]').each(function(index, target) { 3 $.getJSON(target.dataset.file, function(data) 4 { 5 var src = data.map(function(i) 6 { 7 return '<tr class="' + i.class + '">' + 8 '<td>' + i.button + '</td>' + 9 '<td>' + i.song + '</td>' + 10 '</tr>'; 11 }) 12 .join(''); 13 14 src = '<table>' + src + '</table>'; 15 $(target).append(src); 16 }); 17 }); 18});

jQueryは久しぶりで未検証ですが、これで動くと思います。

投稿2023/11/07 16:45

編集2023/11/07 16:53
CTRL-S

総合スコア176

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

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

urk_mofmof

2023/11/09 02:33

追加した際に変更しなくてはならないファイルを極力減らしたいと考えていたので、こちらの回答とてもありがたいです。 JavaScriptで複数のYouTubeを埋め込む処理も別の箇所でしていて、そちらも質問で書いたものと同じようにして動画のidと出力するidセレクタを配列に格納してfor文でなんとかする方法を使っていました。 こちらの回答でいただいた内容を応用してこちらも改善できそうだなと思ったので本当に助かりました! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問