今回は「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' ],