「JavaScript」Array.prototype.sort()で複数データ(Array、配列)ソートする方法

スポンサーリンク

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