今回は「JavaScript」Array.prototype.sort()で複数データ(Array、配列、数値、文字列)ソートする方法について解説したいと思います。
注意
今回はArray.sortを使ってソートを数値、文字列を降順、昇順でソートしますがArray.sortは破壊的な関数なため注意して使いましょう。
サンプルデータ
配列["数学点数","国語点数","理科点数","名前"]
を入れ子で配列でもったデータのソートを解説します。
// ["数学点数","国語点数","理科点数","名前"] const grades = [ [80, 50, 70, 'a'], [80, 60, 70, 'b'], [80, 60, 80, 'bb'], [80, 60, 80, 'bbb'], [80, 60, 80, 'bbbb'], [80, 60, 80, 'bbc'], [70, 70, 70, 'aba'], [70, 50, 70, 'cab'], [90, 70, 70, 'az'], [90, 70, 70, 'ab'], [90, 70, 70, 'abb'], [90, 50, 70, 'aa'], [90, 50, 60, 'baaa'], [90, 50, 60, 'baa'], [60, 50, 70, 'aaa'], ]
ソートその1
数学の点数が高い順(降順)
grades.sort((a, b) => { if (b[0] > a[0]) return 1 if (b[0] < a[0]) return -1 }) console.log(grades) [ [ 90, 70, 70, 'az' ], [ 90, 70, 70, 'ab' ], [ 90, 70, 70, 'abb' ], [ 90, 50, 70, 'aa' ], [ 90, 50, 60, 'baaa' ], [ 90, 50, 60, 'baa' ], [ 80, 50, 70, 'a' ], [ 80, 60, 70, 'b' ], [ 80, 60, 80, 'bb' ], [ 80, 60, 80, 'bbb' ], [ 80, 60, 80, 'bbbb' ], [ 80, 60, 80, 'bbc' ], [ 70, 70, 70, 'aba' ], [ 70, 50, 70, 'cab' ], [ 60, 50, 70, 'aaa' ] ]
ソートその2
数学の点数が高い順(降順)、次に国語の点数が高い順(降順)
grades.sort((a, b) => { if (b[0] > a[0]) return 1 if (b[0] < a[0]) return -1 if (a[1] > b[1]) return 1 if (a[1] < b[1]) return -1 }) console.log(grades) [ [ 90, 50, 70, 'aa' ], [ 90, 50, 60, 'baaa' ], [ 90, 50, 60, 'baa' ], [ 90, 70, 70, 'az' ], [ 90, 70, 70, 'ab' ], [ 90, 70, 70, 'abb' ], [ 80, 50, 70, 'a' ], [ 80, 60, 70, 'b' ], [ 80, 60, 80, 'bb' ], [ 80, 60, 80, 'bbb' ], [ 80, 60, 80, 'bbbb' ], [ 80, 60, 80, 'bbc' ], [ 70, 50, 70, 'cab' ], [ 70, 70, 70, 'aba' ], [ 60, 50, 70, 'aaa' ] ]
ソートその3
数学の点数が高い順(降順)、次に国語の点数が高い順(降順)、次に理科の点数が高い順(降順)
grades.sort((a, b) => { if (b[0] > a[0]) return 1 if (b[0] < a[0]) return -1 if (b[1] > a[1]) return 1 if (b[1] < a[1]) return -1 if (b[2] > a[2]) return 1 if (b[2] < a[2]) return -1 }) console.log(grades) [ [ 90, 70, 70, 'az' ], [ 90, 70, 70, 'ab' ], [ 90, 70, 70, 'abb' ], [ 90, 50, 70, 'aa' ], [ 90, 50, 60, 'baaa' ], [ 90, 50, 60, 'baa' ], [ 80, 60, 80, 'bb' ], [ 80, 60, 80, 'bbb' ], [ 80, 60, 80, 'bbbb' ], [ 80, 60, 80, 'bbc' ], [ 80, 60, 70, 'b' ], [ 80, 50, 70, 'a' ], [ 70, 70, 70, 'aba' ], [ 70, 50, 70, 'cab' ], [ 60, 50, 70, 'aaa' ] ]
ソートその4
数学の点数が高い順(降順)、次に国語の点数が高い順(降順)、次に理科の点数が高い順(降順)、次に名前順(昇順)
grades.sort((a, b) => { if (b[0] > a[0]) return 1 if (b[0] < a[0]) return -1 if (b[1] > a[1]) return 1 if (b[1] < a[1]) return -1 if (b[2] > a[2]) return 1 if (b[2] < a[2]) return -1 if (b[3] < a[3]) return 1 if (b[3] > a[3]) return -1 }) console.log(grades) [ [ 90, 70, 70, 'ab' ], [ 90, 70, 70, 'abb' ], [ 90, 70, 70, 'az' ], [ 90, 50, 70, 'aa' ], [ 90, 50, 60, 'baa' ], [ 90, 50, 60, 'baaa' ], [ 80, 60, 80, 'bb' ], [ 80, 60, 80, 'bbb' ], [ 80, 60, 80, 'bbbb' ], [ 80, 60, 80, 'bbc' ], [ 80, 60, 70, 'b' ], [ 80, 50, 70, 'a' ], [ 70, 70, 70, 'aba' ], [ 70, 50, 70, 'cab' ], [ 60, 50, 70, 'aaa' ] ]
出力結果の最初の3行に注目しましょう。文字列では'ab','abb','az'と少ない文字数を優先し次の文字が出現した場合それ(今回は'az')に推移します。
[ 90, 70, 70, 'ab' ], [ 90, 70, 70, 'abb' ], [ 90, 70, 70, 'az' ],