【JS】特定のものを前/後ろにソートする
こんにちは、しきゆらです。
今回は、JSのソート時に特定の要素だけを前/後ろにソートする方法をメモしておきます。
・・・お前は何を言っているんだ?
と思われるかもしれませんが、たとえば以下のようにしたい、というのが今回の話。
array = [1,2,3,4,5]; //↓ array.sort() //=> [3,4,5,1,2]
特定の条件に合ったものだけを配列の前/後ろに回してほしいということです。
普通であればfilterとかで分けた後にconcatするのかもしれませんが、
今回はソートだけでなんとかしてみよう、という内容です。
JSのソートを調べる
何をするにも、まずはJSのソート関数について調べてみました。
MDN – Array.prototype.sort() https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
基本的には、引数として渡した関数の返り値をもとにソートしてくれるようです。
関数を渡さなければ辞書順でソートしてくれます。
今回の場合に重要なのは以下の部分。
compareFunctionが与えられた場合、配列の要素は比較関数の返り値に基づきソートされます。もし a と b が比較されようとしている要素の場合、
- compareFunction(a, b) が 0 未満の場合、aを b より小さい添字にソートします。
- compareFunction(a, b) が 0 を返す場合、a とb は互いに変更せず、他のすべての要素に対してソートします。注意: ECMAScript 標準はこの振る舞いを保証していないため、一部のブラウザ (例えば、遅くとも 2003 年以前のバージョンの Mozilla) はこれを遵守していません。
- compareFunction(a, b) が 0 より大きい場合、b を a より小さい添字にソートします。
- compareFunction(a, b) に与えられた引数が同じなら戻り値も同じでなければなりません。もし一貫性のない値を返した場合の挙動は未定義となります。
compareFunctionとは、sortの引数として渡される関数のことですね。
この関数が
0未満を返す場合、aを先頭方向へソートし、
0より大きい値を返す場合、aを末尾方向へソートするようです。
これだけわかれば、特定の条件に合う要素を配列の前方/後方へソートできそうです。
簡単に書いてみる
ということで、さっくり書いてみたコードは以下。
const list = [1,2,3,4,5,6,7,8,9]; list.sort((item1, item2) => { if (item1 < 3) { return 1; } return 0; }); // => [3, 4, 5, 6, 7, 8, 9, 2, 1]
要素の値が3未満の物は後ろに追いやる例です。
こんな感じで、単純に前/後ろに追いやるソートは簡単に作れました。
条件を変えれば、いろいろできそうですね。
ということで、今回はここまで。
おわり