ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript ソートテーブルsorting_javascriptスキル

JavaScript ソートテーブルsorting_javascriptスキル

WBOY
WBOYオリジナル
2016-05-16 18:42:511213ブラウズ

1. JavaScript の Sort メソッドを本当に理解していますか?
2. JavaScriptのlocaleCompareメソッドの関数本体をご存知ですか?
3. テーブルのソート方法にはどのようなパラメータが必要ですか?
JavaScript の sort メソッドは、1 つずつ判断するループを記述する必要がなく、直接ソート機能を提供します。ただし、仕組みは同じです。

コードをコピー コードは次のとおりです。

ウィンドウ.onload= function(){
var MyArr=new Array("red","green","gray");
MyArr.sort()
alert(MyArr.toString());
}

出力結果は灰色、緑色、赤色です。これが整数の場合はどうなるでしょうか。
コードをコピー コードは次のとおりです。

window.onload=function(){
var MyArr=new Array(2,25,7);
MyArr.sort();
}

あなたはそれが 2、7、25 だと思っていますが、結果は 2、25、7 であると喜んで言えます。なぜですか?ソート方法は文字列の ASCII に基づいて判断されるため、文字列以外の文字列は最初に文字列
に変換されるため、上記の状況が発生します。では、整数を並べ替えたい場合はどうすればよいでしょうか?変換は非常に簡単ですが、Float や Date などがあった場合はどうすればよいでしょうか。どれも同じで、変換関数を書くだけです。言ったことは必ず実行しなければなりません。

コードをコピー コードは次のとおりです。
function Convert(DataValue,DataType){
switch (DataType){
case "int":
return parseInt(DataValue);
case "float":
return parseFloat(DataValue):
return new Date(Date.parse(DataValue));
default:
return DataValue.toString();
}
}


非常に単純な変換メソッドはDateですので注意してください。基本型とは異なり、毎回新しいオブジェクトが生成されます。
Sort メソッドには sortfunction というパラメーターを含めることができます。
まず簡単な並べ替えメソッドを見てみましょう


コードをコピーします コードは次のとおりです:
function Compare_function(value1,value2){
if(value1return
else if(value1>value2)
return 1;
else
return 0;
}


実際、localeCompare 関数もこれに似ています。 value1 が value2 より小さい場合、-1 が返されます。つまり、順序は並べ替えられます。value1本題に戻りますが、テーブルを並べ替えたい場合は、並べ替えるテーブルのヘッダーをクリックします。 SortTable というメソッドが必要です。では、テーブルの特定の列を並べ替えるにはどのようなパラメータが必要ですか。テーブル?まず、どのテーブルを決定するためにテーブル ID が必要です。次に、どの列を並べ替えるかを
決定する必要があります。最後に、各列のデータは必ずしも文字列である必要はないため、データ型パラメーターが必要です。 SortTable(TableID,Col ,DataType);


コードをコピーします コードは次のとおりです:
var DTable=document.getElementById(TableID );
var DBody=DTable.tBodies[0];
var MyArr=new Array;配列
for (var i=0;iMyArr[i]=DataRows[i];
}
MyArr.sort(CustomCompare(Col, DataType));
//ドキュメント フラグメントを作成し、そこにすべての行を追加します。これは、一時的なストレージ ラックに相当します。(document.body に直接追加した場合、行が 1 回挿入されて更新されます)データが多すぎると、ユーザーのエクスペリエンスに影響します)
//最初にすべての行を一時シェルフに配置し、次に一時シェルフの行を document.body に追加します。更新されるのは 1 回だけです。
//お店で買い物をするときと同じように、まず買いたい商品(行)をすべてリスト(文書の断片)に書き出し、次にスーパーマーケットで1つだけを考えずにすべて購入します。次に、
var frag=document.createDocumentFragment();
for(var i=0;ifrag.appendChild(MyArr[i]);配列内のすべての行をドキュメント フラグメントへ
}
DBody.appendChild(frag);//ドキュメント フラグメント内のすべての行をボディに追加します


このようにして並べ替えを完了すると、Sort メソッドのパラメーターとしてカスタマイズされた並べ替えメソッドである CustomCompare 関数が存在します。この関数には 2 つのパラメーターがあり、1 つは並べ替えられた列、もう 1 つはデータです。タイプ。
関数本体は
コードをコピーします コードは次のとおりです:

return 関数CompareTRs(TR1, TR2){
var value1,value2;
value1=convert(TR1.cells[Col].firstChild.nodeValue,DataType);
value2=convert(TR2.cells[Col]); firstChild.nodeValue, DataType);
if(value1 < value2)
return -1;
else if(value1 > value2)
return 1;
else
return 0 ;
};

もちろん、この形式で記述できるのはクロージャのおかげです。 sort メソッドでは、配列内の各項目 (各項目はテーブルの各行を格納します) を反復処理し、パラメーターを CompareTRs(TR1,TR2) に渡し、結果を返します。
実際にはこれで問題ありませんが、写真を並べ替えたい場合はどうすればよいでしょうか?
それはどのような種類の写真ですか?わからないので、画像のタイトルまたは alt 属性を使用してみましょう。これらは常に文字列にすることができます。カスタム プロパティcustomvalueを指定し、その値で並べ替えます。この属性が含まれているかどうかを判断するために
を実装する場合、CompareTRs メソッドを変更する必要があります。
コードをコピー コードは次のとおりです。

function CustomCompare(Col,DataType){
return function CompareTRs(TR1,TR2){
var value1,value2;
//customvalue 属性があるかどうかを判断します
if(TR1.cells[Col].getAttribute("customvalue")) {
value1=convert(TR1.cells[Col].getAttribute("customvalue"),DataType);
value2=convert(TR2.cells[Col].getAttribute("customvalue"),DataType); 🎜>}
else{
value1=convert(TR1.cells[Col].firstChild.nodeValue,DataType);
value2=convert(TR2.cells[Col].firstChild.nodeValue,DataType);
}
if(value1 < value2)
return -1;
else if(value1 > value2)
return
else
return
};
}

写真の並べ替えも解決されました。ユーザーが複数回並べ替えて複数回クリックしたい場合はどうすればよいでしょうか? CompareTRs メソッドを変更する必要がありますか?
明らかに必要ではありませんが、JavaScript には配列内の各項目を反転できる reverse() メソッドがあります。 SortTable メソッドへの変更は次のようにするだけで済みます

コードをコピーします コードは次のとおりです:
function SortTable(TableID,Col,DataType){
var DTable=document.getElementById(TableID);
var DBody=DTable.tBodies[0];
var DataRows=DBody.rows;
var MyArr=new Array;
for(var i=0;iMyArr[i]=DataRows[i];最後にソートされた列の合計を判定します。今回は同じ列ですか?
if(DBody.CurrentCol==Col){
MyArr.reverse(); //配列を反転します
}
else{
MyArr.sort(CustomCompare (Col,DataType));
}
// ドキュメントのフラグメントを作成し、それにすべての行を追加します。これは一時的なストレージ シェルフに相当します。 document.body に直接追加すると、挿入されます。データが多すぎると、1 行が 1 回更新されます。
//まず、すべての行を一時保管棚に置きます。一時記憶棚の行を document.body に追加すると、テーブルのみが 1 回更新されます。
//お店で買い物をするときと同じように、まず買いたい商品(行)をすべてリスト(文書の断片)に書き出し、次にスーパーマーケットで1つだけを考えずにすべて購入します。次に、
var frag=document.createDocumentFragment();
for(var i=0;ifrag.appendChild(MyArr[i]);配列内のすべての行をドキュメント フラグメントに追加します
}
DBody.appendChild(frag);//ドキュメント フラグメント内のすべての行をボディに追加します
DBody.CurrentCol=Col; //現在を記録します。 sorted columns
}


JavaScript では大文字と小文字の区別が間違いやすいため、必ず注意してください。
上記のコードは正常にテストされ、日付の並べ替えの効果は次のとおりです


すべてのコード:


コードをコピーコードは次のとおりです:




<script type="text/javascript"> <br>var IsAsc=true; <br>function SortTable(TableID,Col,DataType){ <br>var imgSort=document.getElementById('col' Col); 🎜>//逆順か順かを判断します<br>if(IsAsc==true){ <br>imgSort.src='img/arrow_small_down.png' <br>} <br>else{ <br> imgSort.src='img/arrow_small_up.png'; <br>} <br>var DTable=document.getElementById(TableID); <br>var DataRows=DBody.rows; <br>var MyArr=new Array; <br>for(var i=0;i<datarows.length>MyArr[i]=DataRows[i] ; <br>} <br>//最後にソートされた列と今回が同じ列であるかどうかを判断します<br>if(DBody.CurrentCol==Col){ <br>MyArr.reverse(); <br>} <br>else{ <br>MyArr.sort(CustomCompare(Col,DataType)); <br>} <br>// ドキュメント フラグメントを作成し、それにすべての行を追加します。これは、一時ストレージシェルフ、目的は (document.body に直接追加した場合、行が挿入され、一度更新されます。データが多すぎると、ユーザーエクスペリエンスに影響します) <br>//最初にすべての行を配置しますシェルフ内の行はまとめて document.body に追加されるため、テーブルは 1 回だけ更新されます。<br>//お店で買い物をするときと同じように、まず買いたい商品(行)をすべてリスト(文書の断片)に書き出し、次にスーパーマーケットで1つだけを考えずにすべて購入します。次に、 <br> var frag=document.createDocumentFragment(); <br>for(var i=0;i<myarr.length>frag.appendChild(MyArr[i]);配列内のすべての行をドキュメント フラグメントに追加します<br>} <br>DBody.appendChild(frag);//ドキュメント フラグメント内のすべての行をボディに追加します<br>DBody.CurrentCol=Col; //現在を記録します。ソート列<br>} <br>function CustomCompare(Col,DataType){ <br>return function CompareTRs(TR1,TR2){ <br>var value1,value2; <br>//customvalue 属性の有無を判定します<br>if( TR1.cells[Col].getAttribute("customvalue")){ <br>value1=convert(TR1.cells[Col].getAttribute("customvalue"),DataType); TR2.cells[Col].getAttribute("customvalue"),DataType); <br>} <br>else{ <br>value1=convert(TR1.cells[Col].firstChild.nodeValue,DataType); value2=convert( TR2.cells[Col].firstChild.nodeValue,DataType); <br>} <br>if(value1 < value2) <BR>return -1; <BR>else if(value1 > value2) <br>return 1; <br>else <br>return <br>}; <br>function Convert(DataValue,DataType){ <br>case " ": <br>return parseInt(DataValue); <br>case "float": <br>return parseFloat(DataValue); <br>case "date": <br>return new Date(Date.parse(DataValue)) ; <br> デフォルト: <br>return DataValue.toString() <br>}<br></script> <br></head> <br> <br><div id="コンテナ"> <br><table border="1" id="MyTable"> <br> <br><tr> <br><td onclick="SortTable('MyTable',0,'string')" style="cursor:pointer">图片排序 <img id="col0" src="img/arrow_small_up.png" /> </td> <br><td onclick="SortTable('MyTable',1,'int')" style="cursor:pointer">整数排序 <img id="col1" src="img/arrow_small_up.png" /></td> <BR><td onclick="SortTable('MyTable',2,'float')" style="cursor:pointer"> 金額浮排序<img id="col2" src="img/arrow_small_up.png " /></td> <BR><td onclick="SortTable('MyTable',3,'string')" style="cursor:pointer">文字列排序<img id="col3" src="img/arrow_small_up.png " /></td> <BR><td onclick="SortTable('MyTable',4,'date')" style="cursor:pointer">日期排序 <img id="col4" src="img/arrow_small_up.png" /></td> <BR></tr> <br></頭> <br> <br> </tr> <tr> <br><tdcustomvalue="doc"> <br><img src="img/wordicon.gif" /></td> <br><td>2</td> <br><td>5.4</td> <br><td>zd</td> <br><td>2009-10-31 14:33:13</td> <br></tr> <br> </tr> <tr> <br><tdcustomvalue="zip"> <br><img src="img/zippedfoldericon.gif" /></td> <br><td>267</td> <br><td>8.9</td> <br><td>xx</td> <br><td>2002-10-31 14:36:13</td> <br></tr> <br> </tr> <tr> <br><tdcustomvalue="xlt"> <br><img src="img/excelicon.gif" /></td> <br><td>6</td> <br><td>60.4</td> <br><td>ty</td> <br><td>2009-10-31 19:33:13</td> <br></tr> <br> </tr> <tr> <br><tdcustomvalue="txt"> <br><img src="img/notepadicon.gif" /></td> <br><td>9</td> <br><td>0.8</td> <br><td>lp;</td> <br><td>2004-5-31 14:33:13</td> <br></tr> <br> </tr> <tr> <br><tdcustomvalue="doc"> <br><img src="img/wordicon.gif" /></td> <br><td>34</td> <br><td>9.4</td> <br><td>履歴書</td> <br><td>1009-10-31 14:33:13</td> <br></tr> <br> </tr> <tr> <br><tdcustomvalue="txt"> <br><img src="img/notepadicon.gif" /></td> <br><td>289</td> <br><td>23.4</td> <br><td>uio</td> <br><td>2005-10-31 14:33:13</td> <br></tr> <br> </tr> <tr> <br><tdcustomvalue="zip"> <br><img src="img/zippedfoldericon.gif" /></td> <br><td>45</td> <br><td>89.4</td> <br><td>cb</td> <br><td>1039-10-31 14:33:13</td> <br></tr> <br> </tr> <tr> <br><tdcustomvalue="doc"> <br><img src="img/wordicon.gif" /></td> <br><td>2</td> <br><td>5.4</td> <br><td>zd</td> <br><td>2009-10-31 14:33:13</td> <br></tr> <br> </tr> <tr> <br><tdcustomvalue="txt"> <br><img src="img/notepadicon.gif" /></td> <br><td>42</td> <br><td>9.3</td> <br><td>bm</td> <br><td>1069-10-31 14:34:14</td> <br></tr> <br></tbody> <br></table> <br> <br></body> <br></html> <br> </tr></myarr.length></datarows.length> </div></div><div class="nphpQianMsg"><div class="clear"></div></div><div class="nphpQianSheng"><span>声明:</span><div>この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。</div></div></div><div class="nphpSytBox"><span>前の記事:<a class="dBlack" title="jQuery を拡張するためのいくつかの基本的なメソッド キーボード events_jquery" href="https://m.php.cn/ja/faq/23334.html">jQuery を拡張するためのいくつかの基本的なメソッド キーボード events_jquery</a></span><span>次の記事:<a class="dBlack" title="jQuery を拡張するためのいくつかの基本的なメソッド キーボード events_jquery" href="https://m.php.cn/ja/faq/23336.html">jQuery を拡張するためのいくつかの基本的なメソッド キーボード events_jquery</a></span></div><div class="nphpSytBox2"><div class="nphpZbktTitle"><h2>関連記事</h2><em><a href="https://m.php.cn/ja/article.html" class="bBlack"><i>続きを見る</i><b></b></a></em><div class="clear"></div></div><ins class="adsbygoogle" style="display:block" data-ad-format="fluid" data-ad-layout-key="-6t+ed+2i-1n-4w" data-ad-client="ca-pub-5902227090019525" data-ad-slot="8966999616"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script><ul class="nphpXgwzList"><li><b></b><a href="https://m.php.cn/ja/faq/1609.html" title="Bootstrap リスト グループ コンポーネントの詳細な分析" class="aBlack">Bootstrap リスト グループ コンポーネントの詳細な分析</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ja/faq/1640.html" title="JavaScript関数のカリー化の詳細説明" class="aBlack">JavaScript関数のカリー化の詳細説明</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ja/faq/1949.html" title="JS パスワードの生成と強度検出の完全な例 (デモ ソース コードのダウンロード付き)" class="aBlack">JS パスワードの生成と強度検出の完全な例 (デモ ソース コードのダウンロード付き)</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ja/faq/2248.html" title="Angularjs は WeChat UI (weui) を統合します" class="aBlack">Angularjs は WeChat UI (weui) を統合します</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ja/faq/2351.html" title="JavaScript を使用して繁体字中国語と簡体字中国語をすばやく切り替える方法と、簡体字中国語と繁体字中国語の切り替えをサポートする Web サイトのトリック_javascript スキル" class="aBlack">JavaScript を使用して繁体字中国語と簡体字中国語をすばやく切り替える方法と、簡体字中国語と繁体字中国語の切り替えをサポートする Web サイトのトリック_javascript スキル</a><div class="clear"></div></li></ul></div></div><ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-5902227090019525" data-ad-slot="5027754603"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script><footer><div class="footer"><div class="footertop"><img src="/static/imghwm/logo.png" alt=""><p>福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!</p></div><div class="footermid"><a href="https://m.php.cn/ja/about/us.html">私たちについて</a><a href="https://m.php.cn/ja/about/disclaimer.html">免責事項</a><a href="https://m.php.cn/ja/update/article_0_1.html">Sitemap</a></div><div class="footerbottom"><p> © php.cn All rights reserved </p></div></div></footer><script>isLogin = 0;</script><script type="text/javascript" src="/static/layui/layui.js"></script><script type="text/javascript" src="/static/js/global.js?4.9.47"></script></div><script src="https://vdse.bdstatic.com//search-video.v1.min.js"></script><link rel='stylesheet' id='_main-css' href='/static/css/viewer.min.css' type='text/css' media='all'/><script type='text/javascript' src='/static/js/viewer.min.js?1'></script><script type='text/javascript' src='/static/js/jquery-viewer.min.js'></script><script>jQuery.fn.wait = function (func, times, interval) { var _times = times || -1, //100次 _interval = interval || 20, //20毫秒每次 _self = this, _selector = this.selector, //选择器 _iIntervalID; //定时器id if( this.length ){ //如果已经获取到了,就直接执行函数 func && func.call(this); } else { _iIntervalID = setInterval(function() { if(!_times) { //是0就退出 clearInterval(_iIntervalID); } _times <= 0 || _times--; //如果是正数就 -- _self = $(_selector); //再次选择 if( _self.length ) { //判断是否取到 func && func.call(_self); clearInterval(_iIntervalID); } }, _interval); } return this; } $("table.syntaxhighlighter").wait(function() { $('table.syntaxhighlighter').append("<p class='cnblogs_code_footer'><span class='cnblogs_code_footer_icon'></span></p>"); }); $(document).on("click", ".cnblogs_code_footer",function(){ $(this).parents('table.syntaxhighlighter').css('display','inline-table');$(this).hide(); }); $('.nphpQianCont').viewer({navbar:true,title:false,toolbar:false,movable:false,viewed:function(){$('img').click(function(){$('.viewer-close').trigger('click');});}}); </script></body><!-- Matomo --><script> var _paq = window._paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="https://tongji.php.cn/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '9']); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script><!-- End Matomo Code --></html>