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]
スクリプト
(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()
メソッドを適用して数値でソートする際は、引数に比較関数を使うこと。
文字列のソートは引数はなしで昇順ができる。