【問題】
JavaScriptで、多次元配列の親配列の先頭の要素ではなく、子配列の子配列の・・・の要素でsortしたい。
たとえば
[[6,2], [3,9], [1,7], [4,0], [8,5]]
を、こう
[[4,0], [6,2], [8,5], [1,7], [3,9]]
【経緯】
まずここ
配列(Array) に来て
まあソートは出来るわな、と思ったが、比較関数?ってなった。
比較関数って何だろうということで、ここ
配列を数字順にソートする に来たが、
引数のa,bが謎。
で、ここ
比較関数の意味がわからん。 にたどり着いて
もしかして一つ一つ前後を比較しているのか?と思った。
【試行】
ChromeのConsoleで以下のように打ち込む。
yy = new Array( 3, 6, 1, 9, 5, 2, 4, 8, 7 ); yy.sort(function(a,b){ console.log(a,b); });
その結果がこれ
つまり比較関数は、ソート対象の配列の要素一つに対して一回実行され、引数のa,bは当該要素とその一つ前の要素そのものということだろうか?
試しに、、
yy.sort(function(a,b){ console.log(a,b); return 1; });
ということでやってみたら、微妙に不正解。
対象の配列の最初からはじまり、returnで正の値が返ってきたら(つまり並び替えが発生したら)、もう一つ前のものをaとして再び比較関数にかける、ということ?
上記の例ではreturn 1;として強制的に並び替えを発生させているので、console.log(a,b)のうち比較対象が毎回について「前回のチャンピオン」まで勝ち進んでいるのが分かる。
【結論】
とりあえず今回やりたかったことは以下のように実現される。
//JavaScript var params = new Array([6,2], [3,9], [1,7], [4,0], [8,5]); var result = params.sort(function(a,b){return(a[1] - b[1]);}); console.log(result);
//結果 [ [4,0], [6,2], [8,5], [1,7], [3,9] ]
となって、子配列の第二要素でソートできてますね。ちゃんちゃん
【雑感】
まあソートしようと思ったら、最多で今までの全部と比較する必要が出てくるのは当たり前か、、。
このようにして内部処理に興味を持ち始めるお年頃。
DRY