JavaScriptのsortメソッドについて

このQ&Aのポイント
  • JavaScriptのsortメソッドについて質問です。無名関数を使って偶数と奇数を並び替えるコードについてですが、引数a,bには、一体どこの数値が入ってるのでしょうか。
  • sortメソッドでは、引数として使い捨ての関数を作成して利用します。この関数の引数a,bは、配列の要素同士を比較する際に使用されます。具体的には、sortメソッドが要素のペアを比較するたびに、引数aとbに異なる要素が渡されます。
  • 上記の例では、引数aには配列要素の1つ目の値が、引数bには配列要素の2つ目の値が渡されます。この関数内では、偶数を奇数より前にソートするために、引数aとbの偶奇を判定しています。
回答を見る
  • ベストアンサー

javascritp「sort」メソッドについて

WEB制作初心者、勉強中のものです。 javascritpのsortメソッドについて質問です。 無名関数を使って偶数と奇数を並び替えるコードについてですが、 下記の場合、function(a,b)の引数a,bには、一体どこの数値が入ってるのでしょうか。 var no=[1,2,3,・・・]の中だと思うのですが、、、、a,bが一体何を指すのが 教えていただけないでしょうか? // 『sort』の引数として、使い捨ての関数を作成して利用する var no = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; // 配列作成 no.sort(function (a, b) { // 偶数を前に、奇数を後ろにソートする if (a % 2 == 0 && b % 2 != 0) return -1; if (a % 2 != 0 && b % 2 == 0) return 1; return 0; }); alert(no); // 『2, 4, 6, 8, 10, 1, 3, 5, 7, 9』と表示 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

var c = 0; var no = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; // 配列作成 no.sort(function (a, b) { alert([a,b]); c++; if (a % 2 == 0 && b % 2 != 0) return -1; if (a % 2 != 0 && b % 2 == 0) return 1; return 0; }); alert (c); -- そもそも、10かいのるーぷで はんべつできるものを・・・ c は、いくつ? とちゅうに alert ([a,b]) で、なかみを かくにんしましょう!

8710car
質問者

お礼

ありがとうござます!なんとなくですが、動きの理解ができたように思います。 cは22ですね。ただ正直、a,bに入る値のルール、またなぜ22回ループするのか疑問が残ったりしてますが、ソートアルゴリズムとして理解するようにします。 ありがとうございます。

その他の回答 (2)

回答No.3

var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; var b = a.concat(a.reduceRight(function(r,n,i,a){return n%2?a.splice(i,1).concat(r):r},[])); alert (b); var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; for(var i=0,z=a.length,n;i<z;)((n=a[i])%2)?(a.push(n),a.splice(i,1),z--):i++; alert(a); こういうのは?

  • Werner
  • ベストアンサー率53% (395/735)
回答No.2

具体的な確認方法はANo.1の通りです。 sortメソッドを自作すれば分かると思いますが ソートをする為には比較関数(質問のプログラム例では無名関数になっています)を何度か呼び出す必要があります。 (比較回数はソートアルゴリズムなどに依存。) a,bの値は推測されたとおり、配列内の値ですが、 どの数値かは比較関数が呼び出されるたびに変わります。

8710car
質問者

お礼

ありがとうございます!呼び出す回数、呼び出す数値のロジックまで、、深く捉えようとしておりましたが、ソートアルゴリズムとして概念的に捉えようと思います。割り切らないと、今の私のレベルでは前に進めないですね。。。。。本当に有り難うございます。

関連するQ&A

  • Array.sortメソッドのデフォルト比較関数

    JavaScriptのArray.sortメソッドは、 引数を指定しなければデフォルトの比較関数でソートされますが、 この比較関数を取り出して利用できないでしょうか。 要件は、プロパティ[name]と[value]を持ったオブジェクトの配列のソートです。 nameプロパティは半角英数字の文字列で、これをキーにソートしたいと考えています。 ソートの基準は、Array.sortのデフォルトと同じです。 つまり、こんなコードを想定しています。 var ary = [o1, o2, o3]; // o1~o3はそれぞれ上記のオブジェクト ary.sort(function(a, b){ return compare(a.name, b.name); }); このコードにおけるcompare関数を、Array.sortのデフォルト比較関数にしたいのですが、 これは自前で作成するしかないのでしょうか。 数値だけでなく文字列全般の比較になるので、結構実装が面倒そうなのですが、 自作する場合に何か使えそうな標準関数等、無いでしょうか。 今のところ思いついているのは、下記みたいなものです。 var compare = function(a, b) {  var temp = [a, b];  temp = temp.sort();  return temp[0] === a ? -1 : 1; } 比較関数内で更にArray.sortを呼んで2項目をソートし、 順番が入れ替わったかどうかを判定するだけです。 何だか冗長で気持ち悪いコードですので、代案を探しています。

  • action script 3.0 sort

    ActionScript初心者ですが、宜しければご回答お願いします。 下記スクリプトではtsizeの配列の値のインデックスを比較し、 戻り値として -1 1 0 を得る事ができるのですが、 -1 1 0 の戻り値を処理する工程がわかりません。 trace(alist.sort(tSort)); 上記tSort部分に直接 0 や -1 を記入するとエラーになります。 -1 1 0 の戻り値がどのように処理されているのか教えて頂けませんでしょうか? よろしくお願いします。 var tsize:Array = new Array("SS","S","M","L","LL","XL"); function tSort(a:String, b:String):int { //配列での位置を調べる var indexa:int = tsize.indexOf(a); var indexb:int = tsize.indexOf(b); if (indexa<indexb) { return -1; } else if (indexa>indexb) { return 1; } else { return 0; } } var alist:Array = new Array("LL","M","XL","S","L","SS","M","S"); trace(alist.sort(tSort));

  • perlで比較関数を使ったソートの仕方

    今、季節をソートするようなプログラムを考えています。 my @array = ('spring','fall','winter','summer'); my @sort = sort number(@array); sub number { if ($a < $b) { return -1; } elsif ($a == $b) { return 0; } elsif ($a > $b) { return 1; } } 実行結果:spring ,summer ,fall ,winter 比較関数を使用して、「春・夏・秋・冬」とソートできるようにしたいです。上のプログラムはまだ途中なんですが、この場合比較関数はどのように実装すればうまくソートできるんでしょうか?分かる方、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • オブジェクトの中で呼び出される順番とデフォ引数?

    ・意味が分からないコードがあるので教えてください ■コード var arg; var obj = {  hoge : function( arg ) {   var hoge = function(arg){    return function() {    }   }(arg);   hoge();  } } ■質問 ・この時、obj.hoge(arg);と書いたら、どういう処理が走るのでしょうか? ・初めに実行されるのは? 無名関数部分? それともhoge()? ・hoge()を実行する際、引数指定していないので、引数は渡らない?

  • 無名関数を使うメリットは何ですか?

    Javascriptに限らず、多くのプログラム言語で無名関数が使えると思います。以下の2つの記述法は、挙動に違いは全くありませんよね? function func() { return "普通の関数です。"; } var func = function() { return "無名関数です。"; } なぜ無名関数を使うのか調べてみたところ、「最近Ajaxが流行ってきてライブラリを使う機会が増えてきた。それらを利用する際、関数の名前が重複して誤作動するのを防げる」という答えを見つけました。しかし試してみたところ var func = function() { return "無名関数1です。"; } var func = function() { return "無名関数2です。"; } alert(func()); のように名前が被った場合、従来と同じで後に書かれた関数が動作します。イベント駆動型関数を無名関数にするメリットは分かります。たとえば window.onload = function() { alert("ウィンドウの読み込みが完了しました。"); } と書けば、他の関数との衝突によってこの関数が動作しないことはありません(ライブラリを使ってwindow.onloadが重複してしまったら別問題ですが)。 結局のところ、無名関数を使うメリットは何なのでしょうか?

  • JavaScriptの関数に渡される引数について

    Yahoo!知恵袋(http://detail.chiebukuro.yahoo.co.jp/qa/question_detail.php?qid=1469303224)に質問したのですが、補足の文字数が少ない上、返信が出来ないため、申し訳ございませんがこちらで質問させていただきます。 ご回答の中で無名関数というのは分かったのですが、やはりどうしても各プロパティの引数の挙動が分かりません。 445行目のEnumerable.each、521行目のinclude等の場合はどうなのでしょうか? 521: include: function(object) { 522: var found = false; 523: this.each(function(value) { 524: if (value == object) { 525: found = true; 526: throw $break; 527: } 528: }); 529: return found; 530: }, の場合はEnumerable.include(a)と使うと思うのですが、この場合object=aでしょうがvalueには一体何が入っているのでしょうか? value==(object=a)の式比較の意味が分かりません。 それまで存在していないのでundefinedとかかなと思うのですが、それでは意味が通じませんので。 445: var Enumerable = { 446: each: function(iterator) { 447: var index = 0; 448: try { 449: this._each(function(value) { 450: iterator(value, index++); 451: }); 452: } catch (e) { 453: if (e != $break) throw e; 454: } 455: return this; 456: }, の場合もiterator、valueの引数も分かりませんし、iteratorという関数を無名関数の中で使用しているようですが、自分には挙動がちょっと分かりませんでした。

  • 関数を呼んだら、その中の関数も自動実行される?

    ・関数の実行タイミングが分からないので教えてください ・下記で、どうして引数が渡るのでしょうか? ・portal関数を呼んだら、gooプロパティに無名関数が格納される(?)と思うのですが、=関数実行になるのでしょうか? ・無名関数だから? var obj = {  portal : function( arg ) {   var goo = function(arg){    console.log(arg);   }(arg);  } } obj.portal("あ"); ・自分的には、portal関数を呼んで変数gooに無名関数を格納(?)した後、明示的にgoo();と呼ぶ必要があると思うのですが… ・下記でTypeErrorエラーになるのは、gooプロパティが2回呼ばれるから? ・明示的に呼んだ2回目は引数が渡らないから? var obj = {  portal : function( arg ) {   var goo = function(arg){    console.log(arg);   }(arg);   goo();  } } obj.portal("あ"); //TypeError: undefined is not a function

  • ソートで

    get().sort(function() { return Math.round(Math.random()) - 0.5; }) はどういう意味ですか? ソートを return Math.round(Math.random()) - 0.5; でするようですが、 ランダムな数字を出してどうやってソートされるのですか? ソートは文字でか数値ででないのですか? http://memopad.bitter.jp/w3c/jsref/jsref_sort.html では >フォルトで、要素をアルファベットの昇順にソートします。 しかし、数値が正しくソートされません(40が5の前に来ます)。 数値をソートするためには、数を比較する関数を追加しなければなりません。 となっています。 ランダムな数字でソートはできるのですか? 使う意味を教えて下さい。 それから、-0.5をしてるのはどういう意味でしょうか?

  • javascript 一回目実行

    失礼します現在一回目だけ処理したい内容があり、サンプルコードを探してみたのですが、 処理の流れがわからない状態です汗 ご教授頂けると助かります //即時関数 var trueOnlyFirstTime = (function(){ var b = true; //戻り値として関数を実行する return function(){ if(b){ b = false; return true; } return false; }; })();

  • 配列の日付ソート処理2

    先ほど下記のような質問をしたのですが、、、 最初の配列の添え字を取得したい場合はどのようにしたらいいのでしょうか?? ksort($up_date, "cmp"); while (list ($key, $value) = each ($up_date)) { echo "$key: $value\n"; } function cmp ($a, $b) { if ($a == $b) return 0; return ($a > $b) ? -1 : 1; } としても、日付がうまく昇順されません。 この方法では駄目なのでしょうか?? ******************************************* 配列に下記のような日付が入ってます。 $array[0]=2004-11-01 14:20:10.412761+09; $array[1]=2004-11-28 19:09:42.898169+09; $array[2]=2004-11-26 17:16:10.531744+09; $array[3]=2004-11-30 20:25:39.622259+09; これをもっとも新しい日付の順序にしたいのですが、 これはやはり、バブルソートなどを作成する必要がでてきますでしょうか??? *********************************************

    • ベストアンサー
    • PHP

専門家に質問してみよう