JavaScriptのArray.sort覚え書き

お蔵出しシリーズ3。いつだか忘れたけど昔書いて、2013年5月にリライトしたらしいものをほぼそのまま。どうでもいいけどこのシリーズ、タイトルを統一しようとする気持ちがまったく見受けられませんね。

基本

array.sort(比較関数);

配列arrayの要素を、比較関数(省略可)に基づいて並べ替える。並べ替えは破壊的に行われる、つまり配列array自体が並べ替えられて、元の順番は保存されない。

比較関数を省略した場合

配列arrayの各要素を文字列として比較し、辞書順に並べ替える。

たとえば以下のように処理される。

var array = [10,9,5,15,60];
array.sort();

alert(array); // [10,15,5,60,9] ←数値順ではない
alert(typeof array[0]); // number ←要素としてはnumberのまま

数値順に並べ替えたい場合、あるいはもっと複雑な比較を行って並べ替えたい場合は、比較関数の指定が必要。

比較関数

比較関数には2つの要素が引数として渡され、戻り値に応じてその要素の順序が入れ替えられる。仮に比較関数の第一引数をa、第二引数をbとしたとき、

戻り値 < 0 aが前に来るように並べ替えられる
戻り値 == 0 保証なし(順序を入れ替えないことになっている)
戻り値 > 0 bが前に来るように並べ替えられる

という処理が行われる。

function compare(a, b){
  if(aがbより小) {
    return -1; // 負の数であればなんでもいい
  }
  if(aがbより大) {
    return 1;  // 正の数であればなんでもいい
  }
  return 0;
}

array.sort(compare);

compareを別に定義せず、sortメソッド実行時に指定してもよい。無名関数でもOK。

array.sort(function(a, b){
  if(aがbより小) { return -1; } // 負
  if(aがbより大) { return 1;  } // 正
  return 0;
});

要するに、「こういう基準で要素を並べ替えてね」というのをsortメソッドに教えるためのもの。

例:数値の配列を数値として小さい順に並べ替えたいとき
var array = [10,9,5,15,60];

array.sort(function(a, b){ return a - b; });

alert(array); // [5,9,10,15,60] ←数値順

aとbどちらも数値であれば減算できる。aがbより小さければ式「a - b」の結果は負の数になるので、そのまま戻り値にしている。

例:オブジェクトの配列を、各オブジェクトのプロパティ「value」の値が大きい順に並べ替えたいとき
array.sort(function(a, b){
  if(a.value > b.value) { return -1; } // a.valueが大きければ負
  if(a.value < b.value) { return 1;  } // a.valueが小さければ正
  return 0;
});

これだけ覚えろ


aをbよりに置きたいときは戻り値をにする