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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア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
総合スコア596
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。