DRYな備忘録

Don't Repeat Yourself.

多次元配列を特定の深さにある要素でsortしたい【JavaScript】【Array.sort()】【比較関数】

【問題】

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); });

その結果がこれ

f:id:otiai10:20120617172350p:plain

つまり比較関数は、ソート対象の配列の要素一つに対して一回実行され、引数のa,bは当該要素とその一つ前の要素そのものということだろうか?

試しに、、

yy.sort(function(a,b){ console.log(a,b); return 1; });

f:id:otiai10:20120617172409p:plain

ということでやってみたら、微妙に不正解。

対象の配列の最初からはじまり、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