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

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

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

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

jQuery

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

HTML

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

Q&A

解決済

2回答

3402閲覧

javascriptの配列を交互にhtmlの記述リストに入れ込みたい

toramo

総合スコア14

JavaScript

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

jQuery

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

HTML

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

0グッド

1クリップ

投稿2018/04/18 13:52

編集2018/04/18 14:09

実現したいこと

初めまして。初心者のため説明が分かりにくいと思いますがよろしくお願いします。
script.jsに記述した配列を、htmlで見た時に記述リスト(dl/dt/dd)として表示させたいと思っています。
javascriptやhtmlの元データはこちらを参考にしています。
※前提として、underscore.jsが必要なものになります。説明不足で申し訳ありません。

javascript

1var Lists = [ 2 { name: 'あいうえお', tag: ['趣味1','趣味2','趣味3'], desc: ['あああ','いいい','ううう'] }, 3 { name: 'かきくけこ', tag: ['趣味1','趣味2','趣味3','趣味4'], desc: ['かかか','ききき','くくく','けけけ'] }, 4 { name: 'さしすせそ', tag: ['趣味1','趣味2','趣味3'], desc: ['さささ','ししし','すすす'] }, 5 { name: 'たちつてと', tag: ['趣味1','趣味2'], desc: ['たたた','ちちち'] }, 6 ];

という配列があり(中身は仮ですが)、これを実際に

html

1<h3>あいうえお</h3> 2<dl> 3 <dt>趣味1</dt> 4 <dd>あああ></dd> 5 <dt>趣味2</dt> 6 <dd>いいい</dd> 7 <dt>趣味3</dt> 8 <dd>ううう</dd> 9</dl>

のように順番に出力したいのですが、うまくいきません。

試したこと

html

1<dl> 2 <% _.each(line.tag, function(tag) { %> 3 <dt><%= tag %></dt> 4 <% }) %> 5 <% _.each(line.desc, function(tag) { %> 6 <dd><%= tag %></dd> 7 <% }) %> 8</dl>

のように記述してみましたが、やはり

html

1<dl> 2 <dt>趣味1</dt> 3 <dt>趣味2</dt> 4 <dt>趣味3</dt> 5 <dd>あああ></dd> 6 <dd>いいい</dd> 7 <dd>ううう</dd> 8</dl>

のようになってしまいます。
人によって趣味の数が違うため、

javascript

1 { name: 'あいうえお', hobby1name: '趣味1', hobby1desc: 'あああ' hobby2name:・・・},

のように1つずつ書いてもhtml側で個別に対応できないのではないかと勝手に思っています。
また、趣味名(dt)の部分はcssで装飾して説明文(dd)と区別をしたいので、

javascript

1 { name: 'あいうえお', hobby: ['趣味1:あああ','趣味2:いいい','趣味3:ううう']},

とあらかじめくっつけて記述しておくのは個人的にしたくありません。

解決策が分かる方がいましたら、ぜひ教えていただきたく思います。
よろしくお願いいたします。

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

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

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

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

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

defghi1977

2018/04/18 13:54

この質問てば本当にJavaScript?
HayatoKamono

2018/04/18 14:02

underscore.jsが前提であれば、質問文に追記した方がよろしいかと思います。
toramo

2018/04/18 14:10

質問文に追記しました。説明不足で申し訳ありませんでした。
defghi1977

2018/04/18 14:25

データのもたせ方とHTMLの構造及びCSSによるスタイル付けは全く関係ないので, スクリプトの作り次第でどうにでもなります.
guest

回答2

0

html

1<!DOCTYPE html> 2<html> 3 <head> 4 <meta charset="utf-8"/> 5 <script type="text/javascript" src="underscore.js"></script> 6 </head> 7 <body> 8<!--ここから下がUnderscore.jsを使用した処理--> 9 <script> 10 var temp_str = "<% var list = [" + 11 "{ name: 'ムスカ', tag: ['趣味1','趣味2','趣味3'], desc: ['幼女','射撃','目があああ'] }," + 12 "{ name: 'ドーラ', tag: ['趣味1','趣味2','趣味3','趣味4'], desc: ['育児','指揮','度胸','上手そうに食べる'] }," + 13 "{ name: '親方', tag: ['趣味1','趣味2','趣味3'], desc: ['シカと','ゲンコツ','シャツ破り'] }," + 14 "{ name: 'シータ', tag: ['趣味1','趣味2'], desc: ['掃除','バルス'] }];" + 15 "%>" + 16 "<% _.each(list, function(val){ %>" + 17 "<h3><%= val.name %></h3>" + 18 "<dl>" + 19 "<% for(let i = 0; i < val.tag.length; i++){ %>" + 20 "<dt><%= val.tag[i] %></dt>" + 21 "<dd><%= val.desc[i] %></dd>" + 22 "<% } %>" + 23 "</dl>" + 24 "<% }); %>"; 25 var temp = _.template(temp_str); 26 var html = temp(); 27 document.body.innerHTML = html; 28 </script> 29<!--ここから下がUnderscore.js無しの処理--> 30 <script> 31 const list = [ 32 { name: 'ムスカ', tag: ['趣味1','趣味2','趣味3'], desc: ['幼女','ロムスカ・パロ・ウル','目があああ'] }, 33 { name: 'ドーラ', tag: ['趣味1'], desc: ['ハムを食いちぎる'] }, 34 { name: '親方', tag: ['趣味1','趣味2','趣味3'], desc: ['シカと','ゲンコツ','シャツ破り'] }, 35 { name: 'シータ', tag: ['趣味1','趣味2','趣味3','趣味4'], desc: ['掃除','バルス','スルー','物探し'] } 36 ]; 37 //HTML内埋め込みとの境界線 38 let frag_node = document.createDocumentFragment(); 39 const p = document.createElement("p"); 40 const line = document.createTextNode("-------ここから下がUnderscore.js無しの処理-------"); 41 42 p.appendChild(line); 43 frag_node.appendChild(p); 44 for(let i in list){ 45 //h3 46 const h3 = document.createElement("h3"); 47 const name = document.createTextNode(list[i].name); 48 h3.appendChild(name); 49 frag_node.appendChild(h3); 50 //dl 51 const dl = document.createElement("dl"); 52 for(const j in list[i].tag){ 53 //dt 54 const dt = document.createElement("dt"); 55 const tag = document.createTextNode(list[i].tag[j]); 56 dt.className = "tag"; 57 dt.appendChild(tag); 58 dl.appendChild(dt); 59 //dd 60 const dd = document.createElement("dd"); 61 const desc = document.createTextNode(list[i].desc[j]); 62 dd.className = "desc"; 63 dd.appendChild(desc); 64 dl.appendChild(dd); 65 } 66 frag_node.appendChild(dl); 67 } 68 document.body.appendChild(frag_node); 69 </script> 70 </body> 71</html>

面白そうだったのでunderscore.jsちょっとかじってみました!
期待にそえる内容か分かりませんが一応成果を載せておきます。
上のscriptタグがunderscore.jsを使用したコード。
下のscriptタグが未使用のコードです。
「配列操作をバリバリする」もしくは「underscore.jsを使用しないといけない」という状況でないのであれば、下のscriptタグのコードの方が扱いやすいのでお勧めです!
コピペで検証出来ると思いますので参考までに。
<追記>
アドバイスを受けて修正版です。
アドレスありがとうございます!

投稿2018/04/19 00:50

編集2018/04/19 01:09
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

defghi1977

2018/04/19 00:56

あとはDocumentFragmentでノード追加を一回で済ますようにするとよさげ
toramo

2018/04/19 15:16

わざわざ1から記述していただいて有難うございます! 挙げて下さった例に笑ってしまいました。 見事に動きました、まさにこれです、凄いです! 本当はこれをこのまま使用すれば見た目もスッキリして楽なのでしょうが、 下のdefghi1977さんの方法で解決したのでベストアンサーに出来ず申し訳ありません。 保存させていただいたのでまた別な内容で作る際に参考にさせていただきます。 大変お世話になりました。
guest

0

ベストアンサー

例えばこんな?

JavaScript

1document.body.innerHTML = [ 2 { name: 'あいうえお', tag: ['趣味1','趣味2','趣味3'], desc: ['あああ','いいい','ううう'] }, 3 { name: 'かきくけこ', tag: ['趣味1','趣味2','趣味3','趣味4'], desc: ['かかか','ききき','くくく','けけけ'] }, 4 { name: 'さしすせそ', tag: ['趣味1','趣味2','趣味3'], desc: ['さささ','ししし','すすす'] }, 5 { name: 'たちつてと', tag: ['趣味1','趣味2'], desc: ['たたた','ちちち'] }, 6].reduce((prev, obj) => (dtdd => prev + `<h1>${obj.name}</h1><dl>${dtdd}</dl>`)(obj.tag.reduce((prev, t, i) => prev + `<dt>${t}</dt><dd>${obj.desc[i]}</dd>`,"")), "");

もしくはデータのもたせ方を

JavaScript

1[ 2 { name: 'あいうえお', hobby: [['趣味1', 'あああ'], ['趣味2', 'いいい'], ['趣味3', 'ううう']]}, 3 { name: 'かきくけこ', hobby: [['趣味1', 'かかか'], ['趣味2', 'ききき'], ['趣味3', 'くくく'], ['趣味4', 'けけけ']]} 4];

とか

JavaScript

1[ 2 { name: 'あいうえお', hobby: [{'趣味1': 'あああ'}, {'趣味2': 'いいい'}, {'趣味3': 'ううう'}]}, 3 { name: 'かきくけこ', hobby: [{'趣味1': 'かかか'}, {'趣味2': 'ききき'}, {'趣味3': 'くくく'}, {'趣味4': 'けけけ'}]} 4];

としてやれば, 大分HTMLの構造に近づくので処理が行いやすいかと.

投稿2018/04/18 14:07

編集2018/04/18 14:20
defghi1977

総合スコア4756

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

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

toramo

2018/04/18 15:29

早速の回答ありがとうございました。 一番下の記述方法が分かりやすそうだと思い、script.jsをそう修正した上でhtmlを <dl> <% _.each(line.hobby, function(val,key) { %> <dt><%= val %></dt> <dd><%= key %></dd> <% }) %> </dl> と書き換えてみたのですが、全て"[object Object]"とサイト上で表示されてしまいます… 表示されたリストの数自体はちゃんと人それぞれの数に合致していたので、認識はしてくれたのだと思います。 あとは内容さえ表示できればまさにしたかった事になるのですが、どこの記述が悪いのか分かりますでしょうか。 勉強不足で大変申し訳ありません。
defghi1977

2018/04/18 20:30

underscore.jsを知らんからなんとも言えんけど, 配列ならいけるんじゃない? <dl> <% _.each(line.hobby, function(arr) { %> <dt><%= arr[0] %></dt> <dd><%= arr[1] %></dd> <% }) %> </dl> とかで
toramo

2018/04/19 15:20 編集

出来ました!!! 最初は出来ずにサイト表示が止まってしまったのですが、 リストを真ん中の方法([]をさらに[]でくくる方法)に変えたところその通りになりました! 本当にありがとうございました! 今回は大変お世話になりました。お陰でよりよいものが出来そうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問