趣味の学習ノート

IT関連の学習や開発の記録など。

【GAS】配列のsort()を使って数値を昇順・降順に並び替える

GAS(Google Apps Script)の学習。

Javascriptの組み込みオブジェクトである配列の、sort()メソッドの活用。

数値の入った配列を並べ替えたいときに、そのままソートすることができなかったのでまとめた。

配列のsort()メソッドの挙動

通常、配列にsort()メソッドを引数なしで使うと、配列の各要素が「文字列型」に変換されて、昇順での並べ替えが行われる。

なので、[1, 2, 3, 11, 13]のような配列をそのままソートして昇順に並べ替えようとすると、結果は[1, 11, 13, 2, 3]のようになってしまい、欲しい結果を得ることができない 。

const arr = [1, 2, 3, 11, 13];
arr.sort()
console.log(arr); // -> [1, 11, 13, 2, 3]

developer.mozilla.org

スクリプト

(1)数値型の配列を昇順・降順にソートするスクリプト

数値が入った配列を昇順にソートするには、sort()関数の引数に比較関数(compare function)を指定する必要がある。

比較関数は、例えば昇順なら(a, b) => a - bのように記述する。
昇順、降順のやり方は次の通り。

const arr = [1, 2, 3, 11, 13];

// 昇順にソート(小さい順)
arr.sort((a, b) => a - b);
console.log(arr) // -> [1, 2, 3, 11, 13]

// 降順にソート(大きい順)
arr.sort((a, b) => b - a);
console.log(arr) // -> [1, 2, 3, 11, 13]

(2)オブジェクトの配列をそのプロパティの数値により昇順・降順にソートするスクリプト

次のようなオブジェクトの入った配列を、プロパティの数値によりソートしたいケースもあるかと思う。
こういう時もsort()関数の使い方としては基本的には一緒。

const objArr = [
    {no: 1, name: 'A'},
    {no: 11, name: 'B'},
    {no: 5, name: 'C'}
];

// 昇順にソート(noが小さい順)
arr.sort((a, b) => a.no - b.no);
console.log(arr) // -> [ { no: 1, name: 'A' }, { no: 5, name: 'C' }, { no: 11, name: 'B' } ]

// 降順にソート(noが大きい順)
arr.sort((a, b) => b.no - a.no);
console.log(arr) // -> [ { no: 11, name: 'B' }, { no: 5, name: 'C' }, { no: 1, name: 'A' } ]

比較関数について

ここで出てきた比較関数(a, b) => a - b(a, b) => b - aの仕組みについて。

配列から引数a, bとして2つの要素を取り出して、aとbのインデックスを比較関数の戻り値に従って変更する、ということが行われているらしい。

  • 戻り値の演算結果が正(0より大きい)なら、第1引数aが大きいインデックスに入る
  • 戻り値の演算結果が負(0より小さい)なら、第1引数aが小さいインデックスに入る
  • 戻り値の演算結果が0なら、インデックスを変更しない

まとめ

配列にsort()メソッドを適用して数値でソートする際は、引数に比較関数を使うこと。
文字列のソートは引数はなしで昇順ができる。