配列をソートするとき(Array#sort()の引数)に使う比較関数についての覚書
基本
引数を指定しなければ辞書順でのソートになる。数値は文字列として比較されるので、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; });