配列の内容はsort関数を使ってソートすることができます。しかし、これは内容が文字列で比較されるため、以下のように数値をソートしたいときには不都合が生じます。

//配列のソート
var x= [30, 4, 1000, 200];
x.sort();
$.writeln (x); //結果:[1000,200,30,4] (文字列としてソートされる)

 

そういったケースに対応するために、sort関数には「比較関数」という仕組みが用意されています。任意の条件でソートを行う場合は、sort関数の引数に値を評価するための関数を渡します。

//比較関数を使ってソート
//値評価用の関数(a>bなら正の数、a==bなら0、a<bなら負の数を戻す)
function numSort(a,b){
    return a-b; //今回はこれでOK
}
var x= [30, 4, 1000, 200];
x.sort(numSort); //比較関数を指定
$.writeln (x); //結果:[4,30,200,1000] (数値としてソートされる)

 

値評価用の関数には2つの引数が渡されるのでそれを受け取ります(上の例では変数aとb)。そして、これらを評価した場合の結果を以下のように戻します。

  • a>bと評価する場合:正の値(プラスの値)
  • a<bと評価する場合:負の値(マイナスの値)
  • a==bと評価する場合:0

先の例では単純な数値評価なのでIF文を使わず計算結果をそのまま返すようにしていますが、もちろん、以下のように高度な評価を行うこともできます。 

//高度な比較
//値評価用の関数
function tohokuSort(a,b){
    var str= '青森,秋田,岩手,山形,宮城,福島'; //この序列で...
    var aStr= str.indexOf(a); //文字列strでの出現位置
    var bStr= str.indexOf(b); //文字列strでの出現位置
    if (aStr>bStr){return 1;}
    if (aStr>bStr){return -1;}
    return 0; //同列だった
}
var xStr= ['岩手', '宮城', '青森'];
xStr.sort(tohokuSort); //比較関数を指定
$.writeln (xStr); //結果:[青森,岩手,宮城]

 

この仕組みを応用すれば、InDesignのPageItemをページ中の配置座標(bounds)に従ってソートするといったことも可能になります(参照:オブジェクトをboundsでソートする)。

 

 

Joomla templates by a4joomla