Javascriptで、配列をソートしてくれるsortメソッドについて、少し調べてみました。sortメソッドの引数にfunctionを指定するのですが、その戻り値によってソートをコントロールできるようです。
どういった条件でソートさせていくのかチェックすることで、今後思い出しやすいようになればと思います。
※単純に一次元・二次元配列を簡単にソートする方法を知りたい場合は、「【Javascript】一次元・二次元配列を簡単にソートする方法」←こちらをご覧ください
スポンサーリンクsort(・・・)の基本ルール
let test = [5, 3, 4, 1, 2]; test.sort(function(no1, no2) { ・・・ });
Javascriptで、配列をソートしてくれるsortメソッドについて、分かっていた方が使いやすい点が2点あります。
1つ目が「test」の部分には、ソートしたい配列を指定するということです。これは問題ないと思います。
2つ目が「function」の戻り値についてです。ルールは簡単で、下記のとおりです。
- 戻り値が の場合、 する
- 戻り値がプラスの場合、2つ目の引数(上の例だと no2)を前に移動する
- 戻り値が 0 の場合、何もしない
では、昇順、降順にソートする例を見ながら詳しく見ていきたいと思います。
昇順(小さい順)にソートしたい場合
昇順(小さい順)にソートしたい場合は、小さい値を前に移動していけばOKです。
たとえば、「3 2 1」と並んでいるとします。これをそれぞれ比較していきながら、昇順(小さい順)に並び替えてみます。
まず、1つ目「3」と2つ目「2」を比較すると、「2」の方が小さいので、「3」より前に移動します。
「2 3 1」
次に、2つ目「3」と3つ目「1」を比較すると、「1」の方が小さいので、「3」より前に移動します。
「2 1 3」
入れ替わったので再度、1つ目「2」と2つ目「1」を比較すると、「1」の方が小さいので、「2」より前に移動します。
「1 2 3」
後は、どこを比較しても順番は変わりません。以上より、「3 2 1」は昇順(小さい順)に並び変わり、「1 2 3」となりました。
このように、小さい値をどんどん前に移動していけば、昇順(小さい順)に並び変わります。(※降順(大きい順)も同様です)
実際にどのように戻り値を設定すれば良いか確認してみます。
1つ目の要素の方が小さい場合は、1つ目の要素を前に移動したいので、戻り値に
の値を指定して を前に移動させます。また、2つ目の要素の方が小さい場合は、2つ目の要素を前に移動したいので、戻り値にプラスの値を指定して2つ目の要素を前に移動させます。
すると、常に小さい要素を前に移動していくことになるので、最終的に小さい順、つまり昇順にソートされます。実際にコードを書くと下記のようになります。
let test = [5, 3, 4, 1, 2]; test.sort(function(no1, no2) { let ret = 0; // 戻り値 if (no1 < no2) { // no1(1つ目の要素)の方が小さい場合 // 1つ目の要素を前に移動させるためにマイナス ret = 1; } return ret; }); // test = [1, 2, 3, 4, 5]とソートされます} else if (no2 < no1) { // no2(2つ目の要素)の方が小さい場合 // 2つ目の要素を前に移動させるためにプラス
コードをシンプルにすると
let test = [5, 3, 4, 1, 2]; test.sort(function(no1, no2) { return no1 - no2; }); // test = [1, 2, 3, 4, 5]とソートされます
これだけで上に書いたコードと同じソートを実装できます。
本当にそうなるか「no1 – no2」を考えてみます。
- no1の方が小さい場合、「no1-no2」は になります。よって、 を前に移動します
- no2の方が小さい場合、「no1-no2」はプラスになります。よって、2つ目の引数(no2)を前に移動します
上記のとおり、常に小さい要素の方が前に移動していますので、昇順(小さい順)にソートされていきます。慣れると、こちらの方がコードもスッキリしますし、良いかもしれませんね。
ただ、あまりピンと来ない場合は、後でコードを確認するときを考えると、先に書いたコードの方が内容は思い出しやすいかもしれないです。
降順(大きい順)にソートしたい場合
降順(大きい順)にソートしたい場合は、大きい値を前に移動すればOKです。
実際にどのように戻り値を設定すれば良いか確認してみます。
1つ目の要素の方が小さい場合は、1つ目の要素を前に移動したいので、戻り値に
の値を指定して を前に移動させます。また、2つ目の要素の方が小さい場合は、2つ目の要素を前に移動したいので、戻り値にプラスの値を指定して2つ目の要素を前に移動させます。
すると、常に大きい要素を前に移動していくことになるので、最終的に大きい順、つまり降順にソートされます。
実際にコードを書くと下記のようになります。
let test = [5, 3, 4, 1, 2]; test.sort(function(no1, no2) { let ret = 0; // 戻り値 if (no2 < no1) { // no1(1つ目の要素)の方が大きい場合 // 1つ目の要素を前に移動させるためにマイナス ret = -1; } else if (no1 < no2) { // no2(2つ目の要素)の方が大きい場合 // 2つ目の要素を前に移動させるためにプラス ret = 1; } return ret; }); // test = [5, 4, 3, 2, 1]とソートされます
コードをシンプルにすると
let test = [5, 3, 4, 1, 2]; test.sort(function(no1, no2) { return no2 - no1; }); // test = [5, 4, 3, 2, 1]とソートされます
これだけで上に書いたコードと同じソートを実装できます。
こちらも本当にそうなるか「no2-no1」を考えてみます。
- no1の方が大きい場合、「no2-no1」はマイナスになります。よって、1つ目の引数(no1)を前に移動します
- no2の方が大きい場合、「no2-no1」はプラスになります。よって、2つ目の引数(no2)を前に移動します
上記のとおり、常に大きい要素の方が前に移動していますので、降順(大きい順)にソートされていきます。
まとめ
javascriptで配列をソートしてくれるsortメソッドについて簡単に調べてみました。
sortメソッドの引く数に設定するfunction(ソート用関数)には引数を2つ設定し、戻り値がマナイスなら1つ目の引数を、プラスなら2つ目の引数の要素を前に移動する
これを覚えておけば、使う際にsortメソッドの使い方を調べなくても済むようになりそうです。また、もし忘れてても一度覚えておけば「あーそうだった」とすぐに思い出せそうです。
実際問題あまり役に立たないかと思いますが、自分が忘れたら見直してみようと思います。
それでは、最後までお読みいただきありがとうございました!
スポンサーリンク