【JS】特定のものを前/後ろにソートする

JavaScript

こんにちは、しきゆらです。

今回は、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未満の物は後ろに追いやる例です。

 

こんな感じで、単純に前/後ろに追いやるソートは簡単に作れました。

条件を変えれば、いろいろできそうですね。

 

ということで、今回はここまで。

おわり

Posted by しきゆら