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

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

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

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

HTML

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

Q&A

解決済

1回答

1019閲覧

「行」でテーブルをソートする方法はありますか?

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

HTML

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

0グッド

0クリップ

投稿2018/04/01 20:01

編集2018/04/01 21:33

###■やりたいこと
次のようなテーブルがあるとき、縦の列でなく、横の行でソートしたいです。
(鈴木の行をクリックすると、数学の列が左に、国語の列は右になってほしい。)

html

1<table> 2 <thead> 3 <tr> 4 <th data-type="string">名前<span></span></th> 5 <th data-type="integer">国語<span></span></th> 6 <th data-type="integer">数学<span></span></th> 7 </tr> 8 </thead> 9 <tbody> 10 <tr class="dothesort"> 11 <td>鈴木</td><td>12</td><td>9</td> 12 </tr> 13 <tr class="dothesort"> 14 <td>佐藤</td><td>25</td><td>89</td> 15 </tr> 16 <tr class="dothesort"> 17 <td>高橋</td><td>1</td><td>987</td> 18 </tr> 19 <tr class="dothesort"> 20 <td>山田</td><td>604</td><td>78</td> 21 </tr> 22 </tbody> 23</table>

###■やってみたコード
次のjavascriptではうまくいかず、検索しても行ソートというのは見つからず、困ってしまいました。
方法をご存知の方がいらっしゃいましたらどうぞよろしくお願い致します。

javascript

1$(function(){ 2 3//並び替え順を設定 4var sortOrder = 1; //1:昇順, -1:降順 5//行をクリックしたら 6 $('.dothesort').click(function(){ 7 8 var type = $(this).data('type'); 9 var col = $(this).index(); //0, 1 ... 10 11 //行全体を取得 12 var $rows = $('tbody > tr'); 13 14 //行を並び替え(点数で) 15 $rows.sort(function(a,b){ 16 return compare(a, b, type)*sortOrder; 17 18 var arrow.empty.append($rows); 19 20 var arrow = sortOrder === 1 ? “→":"←"; 21 $(.dothesort > span').text(''); 22 $(this).find('span').text(arrow) 23 //並び替え順を反転 24 sortOrder *= -1; 25 }); 26 27 function compare(a, b, type, col){ 28 var _a = $(a).find('td').eq(col).text() *1; 29 var _b = $(b).find('td')eq(col).text() *1; 30 31 if(type == “string"){ 32 if(_a < _b) 33 return -1; 34 } 35 if(_a > _b){ 36 return 1; 37 } 38 return 0; 39 } else { 40 _a *= 1; 41 _b *= 1; 42 return _a - _b 43 } 44 45 } 46 47});

▼動くサンプル
https://jsfiddle.net/q9n0exx8/

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

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

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

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

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

guest

回答1

0

ベストアンサー

ちょっと雑ですが、こういうことでしょうか?

javacript

1$(function(){ 2 $('#t1 tbody tr').each(function(){ 3 $(this).find('td').eq(0).on('click',function(){ 4 var t1=parseInt($(this).siblings().eq(0).text()); 5 var t2=parseInt($(this).siblings().eq(1).text()); 6 if(t1>t2){ 7 $(this).closest('table').find('tr').each(function(){ 8 $(this).find('td,th').eq(1).appendTo($(this)); 9 }); 10 } 11 }); 12 }); 13}); 14

HTML

1<table id="t1"> 2 <thead> 3 <tr> 4 <th data-type="string">名前<span></span></th> 5 <th data-type="integer">国語<span></span></th> 6 <th data-type="integer">数学<span></span></th> 7 </tr> 8 </thead> 9 <tbody> 10 <tr class="dothesort"> 11 <td>鈴木</td><td>12</td><td>9</td> 12 </tr> 13 <tr class="dothesort"> 14 <td>佐藤</td><td>25</td><td>89</td> 15 </tr> 16 <tr class="dothesort"> 17 <td>高橋</td><td>1</td><td>987</td> 18 </tr> 19 <tr class="dothesort"> 20 <td>山田</td><td>604</td><td>78</td> 21 </tr> 22 </tbody> 23</table>

ちょっと改良

こちらのほうがちょっとjQueryらしいかもしれませんね

javascript

1$(function(){ 2 $('#t1 tbody td').filter(function(){ 3 return $(this).closest('tr').find('td').index(this)==0; 4 }).on('click',function(){ 5 var t1=parseInt($(this).siblings().eq(0).text()); 6 var t2=parseInt($(this).siblings().eq(1).text()); 7 if(t1>t2){ 8 $(this).closest('table').find('tr').each(function(){ 9 $(this).find('td,th').eq(1).appendTo($(this)); 10 }); 11 } 12 }); 13});

複数列

複数列バージョンです

javacript

1$(function(){ 2 $('#t1 tbody td').filter(function(){ 3 return $(this).closest('tr').find('td').index(this)==0; 4 }).on('click',function(){ 5 var list=$(this).siblings('td').map(function(x){return {idx:x+1,num:parseInt($(this).text())}}).get(); 6 list.sort(function(x,y){ 7 if(x["num"]==y["num"]) return 0; 8 return x["num"]>y["num"]?1:-1; 9 }); 10 $(this).closest('table').find('tr').each(function(){ 11 var self=$(this); 12 list.forEach(function(x){ 13 self.find('td,th').eq(x["idx"]).clone().appendTo(self); 14 }); 15 self.find('td,th').filter(':gt(0):lt('+list.length+')').remove(); 16 }); 17 }); 18});

HTML

1<table id="t1"> 2<thead> 3<tr> 4<th data-type="string">名前<span></span></th> 5<th data-type="integer">国語<span></span></th> 6<th data-type="integer">数学<span></span></th> 7<th data-type="integer">保健<span></span></th> 8<th data-type="integer">社会<span></span></th> 9<th data-type="integer">美術<span></span></th> 10<th data-type="integer">英語<span></span></th> 11</tr> 12</thead> 13<tbody> 14<tbody> 15<tr class="dothesort"> 16<td>鈴木</td><td>12</td><td>19</td><td>25</td><td>25</td><td>89</td><td>25</td> 17</tr> 18<tr class="dothesort"> 19<td>高橋</td><td>25</td><td>89</td><td>25</td><td>25</td><td>89</td><td>25</td></tr> 20</tr> 21<tr class="dothesort"> 22<td>佐藤</td><td>60</td><td>987</td><td>89</td><td>25</td><td>89</td><td>25</td> 23</tr> 24<tr class="dothesort"> 25<td>山田</td><td>604</td><td>78</td><td>25</td><td>25</td><td>89</td><td>25</td> 26</tr> 27</tbody> 28</table> 29

sample

投稿2018/04/02 01:24

編集2018/04/02 05:57
yambejp

総合スコア114843

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

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

yambejp

2018/04/02 01:48

単に1列目をクリックすると2列目と3列目がいれかわるならもっと簡単。 また2列目と3列目が同値だったときどうするかわからないので その場合はソートしていません
退会済みユーザー

退会済みユーザー

2018/04/02 04:11 編集

yambejpさん、いつもお世話になってます。 今回もさすがのご回答でスグに解決。。と、思いましたら、いくつかナゾ??の不具合を見つけてしまいました。 こちらの➀➁➂です。 https://jsfiddle.net/otoeaszL/19/ どうやら「ちょっと雑版」も「ちょっと改良版」でも同様のようです。 どうかもう一声、お手すきの折にご修正いただけましたら、たいへん幸甚に存じまするです。。 --- きっと➂については、 「>また2列目と3列目が同値だったときどうするかわからない」 とすでに仰っている部分だと思います。それについては、 「列は4列5列6列と続くので同値でもソートしたいです。」 という感じでございます。
yambejp

2018/04/02 05:28

複数列をソートする想定ではなかったので、改めてロジックを見直して 修正版をあげておきました
退会済みユーザー

退会済みユーザー

2018/04/02 08:31

いつも質問に対して的確かつ必要最小限なコードを書いてくださっているのに、後からあれこれアレンジを要求してしまい、大っ変お手数おかけしてすみません。今回もバッチリでした。いつも、いつも、本っ当~~に!どうもありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問