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

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

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

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

jQuery

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

Q&A

2回答

3326閲覧

JSでの、日付配列の整形について

nodananoda

総合スコア10

JavaScript

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

jQuery

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

0グッド

1クリップ

投稿2016/02/10 14:55

JSで、カレンダーを作成しております。
カレンダーの日付を選択すると、その値を取得し、以下のような日付の配列を作成してフォームにセットするスクリプトを組んでいます。

その上で、下記のHTMLフォーマットにマッピングをしたいと考えております。
考えられる限り、チャレンジしたのですが、うまくできない状況です。

どのようにデータを回せばいいのか、ご教授いただけないでしょうか?
よろしくお願いいたします。

■データ(クリック時)
2016/1/2

■データ(フォームにセットする値)
[2016/1/2,2016/2/2,2016/2/9,2016/2/10,2016/2/17,2016/3/10,2016/3/22]

■HTML

<table id="table"> <tbody> <tr> <td><label>1月</label></td> <td><label>2</label></td> <td><label>2月</label></td> <td><label>2,9,10,17</label></td> <td><label>3月</label></td> <td><label>10,22</label></td> </tr> </tbody> </table>

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

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

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

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

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

guest

回答2

0

とりあえず、こんな感じで操作できます。日付を入れる操作だけ書きました。
月を入れる場合も、同じように設定すればできます。
どこまで使えるかわかりませんが、テキストを挿入するなど、操作する対象のラベルには、操作・取得しやすいようクラスやカスタムデータ属性をつけることをお勧めします。

挿入前

HTML

1<table id="table"> 2<tbody> 3<tr> 4<td><label>1月</label></td> 5<!-- 文字を挿入したい箇所には、クラスやカスタムデータ属性をつけてグループ化する --> 6<td><label data-calender-date="1"></label></td> 7<td><label>2月</label></td> 8<td><label data-calender-date="2"></label></td> 9<td><label>3月</label></td> 10<td><label data-calender-date="3"></label></td> 11</tr> 12</tbody> 13</table>

JavaScript

1var data = ['2016/1/2','2016/2/2','2016/2/9','2016/2/10','2016/2/17','2016/3/10','2016/3/22']; 2 3/* 日付を抽出した配列を作成 */ 4var dateArray = []; 5$.map(data, function(item, index){ 6 // 配列内の文字列を「/」で区切り、['2016', '1', '2'] のような配列を作成。 7 var itemArray = item.split('/'), 8 month = itemArray[1], 9 date = itemArray[2], 10 pushIndex = month - 1; 11 12 /* すでに値が入っていればそれを引き継ぎ、なければ新しい配列を作る。*/ 13 dateArray[pushIndex] = dateArray[pushIndex] || []; 14 dateArray[pushIndex].push(date); 15}); 16 17/* 各月の日付を(月の数字-1)番目に格納した二重配列ができる。 18[["2"], ["2", "9", "10", "17"], ["10", "22"]] */ 19console.log(dateArray); 20 21/* data-calender-date属性を持つラベルを取得 */ 22var $label = $('label[data-calender-date]'); 23 24$.map(dateArray, function(item, index){ 25 var str = item.join(), // ["2", "9", "10", "17"] → '2,9,10,17' に。 26 /* 1月の日付は、dateArray[0]に格納されているので、月はindex+1となる。 27 計算と同時に下記の抽出で使用するため、数値型から文字列型に変換している。*/ 28 month = index + 1 + '', 29 /* 挿入先のラベルを抽出。1月なら data-calender-date="1" が設定されているラベルとなる。 */ 30 $targetLabel = $label.filter(function(){ 31 return $(this).attr('data-calender-date') === month; 32 }); 33 34 $targetLabel.text(str); 35});

日付挿入後

HTML

1<table id="table"> 2<tbody> 3<tr> 4<td><label>1月</label></td> 5<!-- 文字を挿入したい箇所には、クラスやカスタムデータ属性をつけてグループ化する --> 6<td><label data-calender-date="1">2</label></td> 7<td><label>2月</label></td> 8<td><label data-calender-date="2">2,9,10,17</label></td> 9<td><label>3月</label></td> 10<td><label data-calender-date="3">10,22</label></td> 11</tr> 12</tbody> 13</table>

投稿2016/02/11 08:19

編集2016/02/11 08:21
yamato_hikawa

総合スコア2092

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

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

0

どのようにデータを扱うかによって最適解は変わってくるかと思いますが、
データを{YEAR: {MONTH: [1,2,3,...], MONTH: [1,2,3,...], ...}}という形式にしてしまうのが何かと扱いやすいのではないかと思いました。

また、データ(フォームにセットする値)ですが、文字列にしておくのが良いかと思います。

javascript

1// ↓ 中身が計算されてしまう 2[2016/1/2,2016/2/2,2016/2/9,2016/2/10,2016/2/17,2016/3/10,2016/3/22] 3// = [1008, 504, 112, 100.8, 59.294117647058826, 67.2, 30.545454545454547] 4 5// ↓ 文字列にしておく 6["2016/1/2","2016/2/2","2016/2/9","2016/2/10","2016/2/17","2016/3/10","2016/3/22"]

ループさせまくっているのでクールな書き方ではないですが、説明しやすい感じのコードでサンプルを記述しておきます。ご自身のプロジェクトに合うようにリファクタなり考え方の参考なりに

javascript

1// セットされてる配列 2var data = ["2016/1/2","2016/2/2","2016/2/9","2016/2/10","2016/2/17","2016/3/10","2016/3/22"]; 3 4// {YEAR: {MONTH: [1, 2, 3, ...]}} という形にデータを整形してformatDataに代入 5var formatData = (function(data) { 6 var newData = {}; 7 for(var i=0, l=data.length; i<l; i+=1) { 8 var year, 9 month, 10 day, 11 // 2016/1/2 という形式なので / で分割 12 date = data[i].split('/'); 13 if(date.length === 3) { 14 year = date[0]; 15 month = date[1]; 16 day = date[2]; 17 if(!newData[year]) { 18 newData[year] = {}; 19 } 20 if(!newData[year][month]) { 21 newData[year][month] = []; 22 } 23 newData[year][month].push(day); 24 } 25 } 26 return newData; 27})(data); 28 29console.log(formatData); 30 31// 整形したデータをぐるぐる回して出力するHTMLを作る 32var html = ''; 33// 年が固定ならこの外側のループ無くせます。 34Object.keys(formatData).forEach(function(year) { 35 var yearObj = formatData[year]; 36 html += '<tr data-year="' + year + '">'; 37 Object.keys(yearObj).forEach(function(month) { 38 var days = yearObj[month].join(','); 39 html += '<td><label>' + month + '月</label></td>' 40 + '<td><label>' + days + '</label></td>'; 41 }); 42 html += '</tr>'; 43}); 44 45// jQueryでHTMLに挿入? 46$('#table').find('tbody').html( html );

投稿2016/02/10 17:56

KiKiKi_KiKi

総合スコア596

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問