配列をソートするとき(Array#sort()の引数)に使う比較関数についての覚書

JavaScript 第5版118ページ

基本

引数を指定しなければ辞書順でのソートになる。数値は文字列として比較されるので、33と4では1文字目(3と4)の比較となり33が先になる。

var a = [33, 4, 1111, 222];
a.sort();  // 1111, 222, 33, 4(辞書順)

他の順序でソートしたい場合は引数に比較関数を指定する。この関数は引数を2つ取り、両者を比較する。引数を順にa,bとすると...

  • aをbよりにしたければ、関数の戻り値をの数にする。
  • aをbよりにしたければ、関数の戻り値をの数にする。
  • aとbに順序関係がないのであれば、関数の戻り値を0にする。
var a = [33, 4, 1111, 222];
a.sort(function(a,b){  // 4, 33, 222, 1111(数値順)
    return a-b;        // a > bなら正の数、a == bなら0、a < bなら負の数が返る
});



Array.prototype.sort() | MDN

function compare(a, b) {
  if (ある順序の基準において a が b より小)
     return -1;
  if (その順序の基準において a が b より大)
     return 1;
  // a は b と等しいはず
  return 0;
}

過程を見る

http://www.tagindex.com/kakolog/q4bbs/1701/2016.html
比較関数内でalert()やconsole.log()を用いてaとbの値を出力させていけば、どのように各要素を比較させていくのかが分かる。

大文字小文字を区別せずにアルファベット順にソート

var a = ["a", "C", "d", "B"];
a.sort(function(a,b){     // a, B, C, d
    a = a.toString().toLowerCase();
    b = b.toString().toLowerCase();
    if(a > b)  return 1;
    if(a < b)  return -1;
    return 0;
});

偶数の前に奇数をソート

var a = [5, 2, 6, 1, 3, 4];

a.sort(function(a,b){  // 5, 1, 3, 2, 6, 4
  return b%2 - a%2;
});

a.sort(function(a,b){  // 1, 3, 5, 2, 4, 6
  if(a%2 == b%2)  return a - b;
  return b%2 - a%2;
});