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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

EJS

EJSは、JavaScript用のテンプレートエンジン。HTMLなどのテンプレートテキストにJavaScriptのロジックを記述することができます。また、変数・関数の実行をテンプレートテキスト内に埋め込むことも可能です。

JSON

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

JavaScript

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

Q&A

解決済

1回答

497閲覧

CSVファイルにて、特定の項目がもつ複数の値を取得+出力したい。【連想配列/配列/ループ処理/ループの中のループ処理?】

kitty

総合スコア15

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

EJS

EJSは、JavaScript用のテンプレートエンジン。HTMLなどのテンプレートテキストにJavaScriptのロジックを記述することができます。また、変数・関数の実行をテンプレートテキスト内に埋め込むことも可能です。

JSON

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

JavaScript

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

0グッド

0クリップ

投稿2019/06/18 01:26

前提条件

CSVファイルを作成→gulpでJSONデータに変換→EJSで読み込む→HTMLに出力
という流れで現在制作をしています。

やりたいこと

項目が複数あるうち、一つの項目**(※項目5)**だけが値を複数もっています。
その複数の値をひとつずつループさせて出力したい。
カンマ区切りでばらばらにして配列にするところまでできているが
取得の仕方がわからない。
(説明が分かりづらいと思うので、下記の①~④をご確認ください。)

①CSVファイルのイメージ

イメージ説明
項目5はカンマ区切りになっていて、
これをひとつひとつバラして出力したい。
(今回はサンプルとして3行だけ用意しています。項目5の個数は行によって異なります。)

②EJS(項目5が出力できていないejs)

ejs

1<% for(var i = 0;i < sample.length;i++) { %> 2<a href="<%- sample[i]['項目1'] %>" class="p-new-item hover-opacity"> 3 <div class="p-new-item__mod"> 4 <p><%- sample[i]['項目2'] %><span><%- sample[i]['項目3'] %></span></p> 5 6 <ul class="p-new-item__category"> 7 <li class="category-item"><% ここに、項目5にある分だけの値を取得&出力したい %></li> 8 </ul> 9 </div> 10 <p class="p-new-item__btn"><%- sample[i]['項目4'] %></p> 11</a> 12<% } %>

③JSON(sampleという名前でejsと連携させています)

json

1[{"項目1":"一週目:項目1の内容","項目2":"一週目:項目2の内容","項目3":"一週目:項目3の内容","項目4":"一週目:項目4の内容","項目5":"項目5-1,項目5-2,項目5-3"},{"項目1":"二週目:項目1の内容","項目2":"二週目:項目2の内容","項目3":"二週目:項目3の内容","項目4":"二週目:項目4の内容","項目5":"項目5-2-1,項目5-2-2,項目5-2-3"},{"項目1":"三週目:項目1の内容","項目2":"三週目:項目2の内容","項目3":"三週目:項目3の内容","項目4":"三週目:項目4の内容","項目5":"項目5-3-1,項目5-3-2,項目5-3-3"}]

④成功イメージHTML

※該当ソースをteratail用に修正しているのでタグの使い方ミスやclass名の揺れは一旦無視してください。

html

1<a href="一週目:項目1の内容" class="p-new-item hover-opacity"> 2 <div class="p-new-item__mod"> 3 <p>一週目:項目2の内容<span>一週目:項目3の内容</span></p> 4 <ul class="p-new-item__category"> 5 <li class="category-item">項目5-1</li>//例が悪いのですが、この「.category-item」の数は変化する 6 <li class="category-item">項目5-2</li> 7 <li class="category-item">項目5-3</li> 8 </ul> 9 </div> 10 <p class="p-new-item__btn">一週目:項目4の内容</p> 11</a> 12<a href="二週目:項目1の内容" class="p-new-item hover-opacity"> 13 <div class="p-new-item__mod"> 14 <p>二週目:項目2の内容<span>二週目:項目3の内容</span></p> 15 <ul class="p-new-item__category"> 16 <li class="category-item">項目5-2-1</li>//例が悪いのですが、この「.category-item」の数は変化する 17 <li class="category-item">項目5-2-2</li> 18 <li class="category-item">項目5-2-3</li> 19 </ul> 20 </div> 21 <p class="p-new-item__btn">二週目:項目4の内容</p> 22</a> 23<a href="三週目:項目1の内容" class="p-new-item hover-opacity"> 24 <div class="p-new-item__mod"> 25 <p>三週目:項目2の内容<span>三週目:項目3の内容</span></p> 26 <ul class="p-new-item__category"> 27 <li class="category-item">項目5-3-1</li>//例が悪いのですが、この「.category-item」の数は変化する 28 <li class="category-item">項目5-3-2</li> 29 <li class="category-item">項目5-3-3</li> 30 </ul> 31 </div> 32 <p class="p-new-item__btn">三週目:項目4の内容</p> 33</a>

ためしたこと

ejs

1 <ul class="p-new-item__category"> 2 <% var str = sample[i]['項目5']; 3 var arr = str.split(','); 4 %> 5 <li class="category-item"><%- arr[0] %></li> 6 </ul> 7//=>これで<%- arr[0] %><%- arr[1] %>・・・と記載していくと希望通りの形になりますが 8今回個数が固定になっていないので不採用。

ejs

1for(var i = 0;i < sample.length;i++) { %> 2<%- arr[i] %> 3//=>1行分のみのループ+3行分の項目5分をループしている

ejs

1for(var i = 0;i < arr.length;i++) { 2arr[i] 3//=>ループが終わらない

※該当ソースをteratail用に修正しているのでタグの使い方ミスやclass名の揺れは一旦無視してください。

jsの問題かと思いますが、
アドバイスいただければ助かります。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ejsというものの仕様を理解していないのですがdom的にやればこう?

javascript

1<script> 2window.addEventListener('DOMContentLoaded', function(e){ 3 var json=[{"項目1":"一週目:項目1の内容","項目2":"一週目:項目2の内容","項目3":"一週目:項目3の内容","項目4":"一週目:項目4の内容","項目5":"項目5-1,項目5-2,項目5-3"},{"項目1":"二週目:項目1の内容","項目2":"二週目:項目2の内容","項目3":"二週目:項目3の内容","項目4":"二週目:項目4の内容","項目5":"項目5-2-1,項目5-2-2,項目5-2-3"},{"項目1":"三週目:項目1の内容","項目2":"三週目:項目2の内容","項目3":"三週目:項目3の内容","項目4":"三週目:項目4の内容","項目5":"項目5-3-1,項目5-3-2,項目5-3-3"}]; 4 json.forEach(x=>{ 5 var a=document.createElement('a'); 6 document.querySelector('#hoge').appendChild(a); 7 a.setAttribute('href',x["項目1"]); 8 a.setAttribute('class','p-new-item hover-opacity'); 9 var div=document.createElement('div'); 10 a.appendChild(div); 11 div.setAttribute('class','p-new-item__mod'); 12 var p=document.createElement('p'); 13 div.appendChild(p); 14 var span=document.createElement('span'); 15 p.appendChild(span); 16 span.appendChild(document.createTextNode(x["項目3"])); 17 p.appendChild(document.createTextNode(x["項目2"])); 18 var ul=document.createElement('ul'); 19 div.appendChild(ul); 20 ul.setAttribute('class','p-new-item__category'); 21 x["項目5"].split(",").forEach(y=>{ 22 var li=document.createElement('li'); 23 ul.appendChild(li); 24 li.setAttribute('class','category-item'); 25 li.appendChild(document.createTextNode(y)); 26 }); 27 var p=document.createElement('p'); 28 a.appendChild(p); 29 p.setAttribute('class','p-new-item__btn'); 30 p.appendChild(document.createTextNode(x["項目4"])); 31 }); 32}); 33 34</script> 35<div id="hoge"></div> 36

投稿2019/06/18 02:32

yambejp

総合スコア114814

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

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

kitty

2019/07/07 04:45

ご返信を見落としておりました。遅くなってすみません。 結局、jQueryのemptyメソッドを使用しました。(一度、項目5の最大個数分ループさせて出力→最大個数よりも少ない場合は中身が空のli.category-itemが発生→それをemptyで削除) 無理矢理で汎用性はありませんが、今回は手短に済ませることにしました。 今回ご教示いただいたものは使用しませんでしたが、確かにこれでしたら希望通りの出力が出来そうですね。 次回の参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問