以下のようなデータがあり、これを、同一カラム内で同じ内容のセルは結合して表示したいと考えました。
(便宜上表の一区画をセルと表現します)
var data = [ { city: "関東", pref: "東京" }, { city: "関東", pref: "千葉" }, { city: "関東", pref: "神奈川" }, { city: "関東", pref: "埼玉" }, { city: "中部", pref: "名古屋" }, { city: "近畿", pref: "大阪" }, { city: "近畿", pref: "京都" } ]
目標は以下のような表です。
(関東や近畿の下のセルは、rowspanで結合されていたいのですが、
teratail ですと、セルの結合表示ができません・・・)
city | pref |
---|---|
関東 | 東京 |
千葉 | |
神奈川 | |
埼玉 | |
中部 | 名古屋 |
近畿 | 大阪 |
京都 |
ネット検索してみましたら、結合前の表をhtmlで作成、後からjQueryを使って結合するなどのライブラリがありましたが、
少しでも速度が早いほうが、、とデータを前処理する以下のやり方をとりました。
やってみたこと
まず、データをrowspanで処理しやすいように以下のようにすることを目標にしました。
var data = [ { city: ["関東",4] pref: "東京" }, { pref: "千葉" }, { pref: "神奈川" }, { pref: "埼玉" }, { city: ["中部",1], pref: "名古屋" }, { city: ["近畿",2], pref: "大阪" }, { city: pref: "京都" } ]
そのために、以下のコードを書きました。
JS
1var c = 0 2data.forEach((d, i) => { 3 if (i + 1 === data.length || data[i].city !== data[i + 1].city) { 4 if (c > 0) { 5 for (t = 0; t < c; t++) { delete data[i - t].city } 6 data[i - c].city = [data[i - c].city, c + 1] 7 c = 0 8 return 9 } else { 10 data[i].city = [data[i].city, 1] 11 } 12 } 13 if (data[i].city === data[i + 1].city) { 14 c++ 15 } 16})
そして、最後にjQueryを用いて以下のようにしました。
js
1data.forEach(function (d) { 2 var row = `<tr>` 3 if (d.city) 4 var row_city = `<th rowspan="${ d.city[1] }" >${ d.city[0] }</th>` 5 else 6 var row_city = `` 7 var row_pref = `<td>${ d.pref }</td>` 8 var row_end = `</tr>` 9 var row_mixed = row + row_city + row_pref + row_end 10$("#testTable").append(row_mixed) 11})
現実の実装では、カラムも複数あり、上のようなやり方でよいのか不安です。
よりよい方法(コード)などありましたら、ご教示いただけませんでしょうか。
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/18 11:41 編集
2019/12/18 14:44