- ベストアンサー
関数で定義した配列のソート
お世話になります。 配列のソートは xx = new Array(3, 7, 8, 1); xx.sort(); document.write('xx='+xx+'<br>'); function hikaku(a, b) { return(b - a); } yy = new Array(3, 7, 8, 1); yy.sort(hikaku); document.write('yy='+yy+'<br>'); で、できました。 ここで、 function aitem(name,value,date){ this.name=name; this.value=value; this.date=date; } var goods=new Array( new aitem('b',500,'06/05/01'), new aitem('a',200,'06/07/01'), new aitem('d',800,'06/06/01'), new aitem('c',300,'05/09/01'), ); と、配列goodsを定義します。 そして、例えばvalueで並び替えた配列を取得するなんてことはできないでしょうか。 よろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
cmp_by_name の定義が×です。 文字列を引き算しても、ソートのために必要な結果は得られません。 Perlなら cmp という便利な演算子があるのですが、そんなものはないので ちょっと迂遠ですが function cmp_by_name(x, y) { if (x.name == y.name) return 0; else if (x.name > y.name) return 1; else return -1; } とでも定義しましょう。
その他の回答 (6)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#4>nameフィールドでソートしようと sort で用いる関数は、大小関係に合わせて0,正の値,負の値を返す必要があります。 数値ではなく文字列(名前)の場合、単純に引き算の結果を返すワケにはいきません。 おそらく文字列の引き算でエラーになっている。 文字列を数値と解釈しようとして結果がいつも0になっている。 などが原因として考えられます。 以下のように修正下さい。 ---------------------------------------------------------------- <html> <head> <title>test</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script language="javascript" type="text/javascript"> function aitem(name,value,date){ this.name=name; this.value=value; this.date=date; } function cmp_by_value(x, y) { return x.value - y.value; } function cmp_by_name(x, y){ if(x.name==y.name)return 0; return (x.name > y.name)? 1 : -1; } </script> </head> <body> <p>実験</p> <p> <script language="javascript" type="text/javascript"> var goods=new Array( new aitem('b',500,'06/05/01'), new aitem('a',200,'06/07/01'), new aitem('d',800,'06/06/01'), new aitem('c',300,'05/09/01') ); for (v in goods) { document.write(goods[v].name + " " + goods[v].value + " " + goods[v].date); document.write("<br>") } document.write("<p><strong>sort! value</strong></p>"); goods.sort(cmp_by_value); for (v in goods) { document.write(goods[v].name + " " + goods[v].value + " " + goods[v].date); document.write("<br>") } document.write("<p><strong>sort! name</strong></p>"); goods.sort(cmp_by_name); for (v in goods) { document.write(goods[v].name + " " + goods[v].value + " " + goods[v].date); document.write("<br>") } </script> </p> </body> </html>
お礼
お陰でできました。 いつもご丁寧にありがとうございます。 また少しJavaScriptについてわかったような気がします。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#3>試してみたソースは、#2にのものです。 こちらでも試してみましたが、 XPProSP2 IE6, Firefox1.5 のどちらでも動作しました。 おそらく、試されているソースの一部にエラーが生じるようなミスがあるのだと思います。 やはり、そちらで試されているソースを補足していただくのが早道かと存じます。
お礼
レスありがとうございます。 >おそらく、試されているソースの一部にエラーが生じるようなミスがあるのだと思います。 その通りでした。 #4のお礼に書かせて頂きました。 しかし、新たな疑問もありまして、これも#4のお礼に書かせて頂きましたが、 また、ボンミスかと、調べてみましたがわかりません。 スクリプトを掲載させて頂きます。 <html> <head> <title>test</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script language="javascript" type="text/javascript"> function aitem(name,value,date){ this.name=name; this.value=value; this.date=date; } function cmp_by_value(x, y) { return x.value - y.value; } function cmp_by_name(x, y) { return x.name - y.name; } </script> </head> <body> <p>実験</p> <p> <script language="javascript" type="text/javascript"> var goods=new Array( new aitem('b',500,'06/05/01'), new aitem('a',200,'06/07/01'), new aitem('d',800,'06/06/01'), new aitem('c',300,'05/09/01') ); for (v in goods) { document.write(goods[v].name + " " + goods[v].value + " " + goods[v].date); document.write("<br>") } document.write("<p><strong>sort! value</strong></p>"); goods.sort(cmp_by_value); for (v in goods) { document.write(goods[v].name + " " + goods[v].value + " " + goods[v].date); document.write("<br>") document.write("<p><strong>sort! name</strong></p>"); goods.sort(cmp_by_name); for (v in goods) { document.write(goods[v].name + " " + goods[v].value + " " + goods[v].date); document.write("<br>") } </script> </p> </body> </html>
- sakusaker7
- ベストアンサー率62% (800/1280)
↓こんなんでやってみましたが、IE6でもソートされましたけど? <html> <head> <title>test</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script language="javascript" type="text/javascript"> function aitem(name,value,date){ this.name=name; this.value=value; this.date=date; } function cmp_by_value(x, y) { return x.value - y.value; } </script> </head> <body> <p>実験</p> <p> <script language="javascript" type="text/javascript"> var goods=new Array( new aitem('b',500,'06/05/01'), new aitem('a',200,'06/07/01'), new aitem('d',800,'06/06/01'), new aitem('c',300,'05/09/01') ); for (v in goods) { document.write(goods[v].name + " " + goods[v].value + " " + goods[v].date); document.write("<br>") } document.write("<p><strong>sort!</strong></p>"); goods.sort(cmp_by_value); for (v in goods) { document.write(goods[v].name + " " + goods[v].value + " " + goods[v].date); document.write("<br>") } </script> </p> </body> </html>
お礼
レスありがとうございます。 私の場合、次にnameフィールドでソートしようと function cmp_by_value(x, y) { return x.name - y.name; } をスクリプトの下の方で定義していました。 これを、 function cmp_by_name(x, y) { return x.name - y.name; } と、したら動作しました。 どうもお騒がせしました。 IE6で動作しなくて、NN8,FireFoxで、動作したというのは、IE6では、スクリプト内の関数を最初に全て吟味すからなのかな、などと勝手に納得しました。 そして、新たな疑問です。 上に書いたように function cmp_by_name(x, y) { return x.name - y.name; } と、定義して、今度は、nameで並び替えようと goods.sort(cmp_by_name); と、しました。 すると、IE6では、ここでスクリプトが停止してしまいます。 NN6では、スクリプトが停止しませんが、表示される結果がnameで並び変わっていません。 valu,nameと、いう命名が悪かったのかと、他の予約語として使われないような名前に変えてみましたが、結果は同じでした。 また、ポカをしていないかと、調べましたが、見つけられません。 基本的にどこかおかしいのでしょうか。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#1>goods.sort(cmp_by_value); #1>と、してみましたが、ダメでした。 どうダメだったんでしょうか? 試してみたソースを補足して下さい。
お礼
BLUEPIXYさん、お早うございます。 >どうダメだったんでしょうか? >試してみたソースを補足して下さい。 試してみたソースは、#2にのものです。 どうダメだったか、#2の「お礼」に記載させていただきました。
- sakusaker7
- ベストアンサー率62% (800/1280)
Firefox のJavaScriptインタプリタを切り出して独立した実行ファイルになっているので確認しました。 function aitem(name,value,date){ this.name=name; this.value=value; this.date=date; } var goods=new Array( ew aitem('b',500,'06/05/01'), new aitem('a',200,'06/07/01'), new aitem('d',800,'06/06/01'), new aitem('c',300,'05/09/01') ); function cmp_by_value(x, y) { return x.value - y.value; } for (v in goods) { print(goods[v].name + " " + goods[v].value + " " + goods[v].date); } print("sort!"); goods.sort(cmp_by_value); for (v in goods) { print(goods[v].name + " " + goods[v].value + " " + goods[v].date); } 実行結果は以下の通りです。 b 500 06/05/01 a 200 06/07/01 d 800 06/06/01 c 300 05/09/01 sort! a 200 06/07/01 c 300 05/09/01 b 500 06/05/01 d 800 06/06/01 valueでソートされてますよね?
お礼
お早うございます。ご丁寧にありがとうございます。 教えていただいたスクリプトをコピーして試してみました。 Firefox 、NN8では期待した結果が得られましたが、IE6では document.write("sort!"); goods.sort(cmp_by_value); document.write("sorted!"); で、 sort!は、表示されますが、sorted!が表示されませ んでした。ここで、scriptが停止しているようです。 つまり、並び替えられた結果の表示もされませんでした。 IE6に対しては、何か対処が必要なのでしょうか。
- sakusaker7
- ベストアンサー率62% (800/1280)
function cmp_by_value(x, y) { return x.value - y.value; } ↑こんな関数を定義してやって(別にこの程度なら無名関数でもいいですけど)sortの引数として与えてやったらできましたが?
お礼
sakusaker7さん、今晩は、 早速レスありがとうございます。 goods.sort(cmp_by_value); また、 value.sort(cmp_by_value); と、してみましたが、いずれもダメでした。 JavaScriptがまだまだわかっていなくてご迷惑をおかけします。 どうしたものでしょうか。
お礼
できました。 長い間ご親切にありがとうございました。 また、JavaScriptについて少しわかったような気がします。