【JavaScript】配列の要素を昇順(A-Z順)と降順(Z-A順)に並び替える

  • このエントリーをはてなブックマークに追加

配列の要素を昇順(A-Z順)と降順(Z-A順)に並び替えるのは、sortメソッドを使用する。
アルファベット順が昇順。
アルファベット逆順が降順。

昇順【ascending order】asc
降順【descending order】desc

文字列を比較して、並び替えをするのがsortメソッド。
文字列を比較すると、次のような挙動になる。


if("Naoki" > "Akira"){
  //真になる
  console.log("真");
}


sortメソッドに渡すソート順を定義する関数の戻り値によって並び替えを行う。

(関数の戻り値 > 0)の場合、a を b の後に並べる
(関数の戻り値 < 0)の場合、a を b の前に並べる
(関数の戻り値 === 0)の場合、a と b の元の順序を維持する

つまり、
if(“Naoki” > “Akira”)が真になり戻り値が0より大きい場合、「Akira,Naoki」の順番に並び替わる。

並び替えは次のようになる。


const array = ["risa","john","Naoki", "Akira", "John", "Risa"];

array.sort(function(a, b) {

    if (a < b) {
        return -1;
    } else {
        return 1;
    }

    return 0;

});

//昇順(A-Z順)に配列の要素を並び替える
console.log(array);

array.sort(function(a, b) {

    if (a > b) {
        return -1;
    } else {
        return 1;
    }

    return 0;

});

//降順(Z-A順)に配列の要素を並び替える
console.log(array);

/*

Array(6) [ "Akira", "John", "Naoki", "Risa", "john", "risa" ]
Array(6) [ "risa", "john", "Risa", "Naoki", "John", "Akira" ]

*/

並び替える配列の要素に「John」と「john」があるとき、「大文字,大文字,大文字,・・・,小文字,小文字,小文字」のように並んでしまう。John,johnの順に並び変えるには、sortメソッドを2回使うとできた。

うーん。やっぱり2回sortメソッドが必要か?他の方法ってないのかな?まぁ、とりあえず、これでいいか。


const array = ["Risa", "john", "John", "john", "john", "Akira", "risa"];

//すべて小文字にして並び変える
array.sort((a, b) => {

    if (a.toLowerCase() < b.toLowerCase()) {
        return -1;
    }

    if (a.toLowerCase() > b.toLowerCase()) {
        return 1;
    }

    return 0;

});

console.log(array);

/*
Array(7) [ "Akira", "john", "John", "john", "john", "Risa", "risa" ]
*/

//「John,john」のように大文字、小文字の順で並び変える
array.sort((a, b) => {

    if ((a.toLowerCase() === b.toLowerCase()) && a > b) {
        return 1;
    }

    if ((a.toLowerCase() === b.toLowerCase()) && a < b) {
        return -1;
    }

    return 0;

});

console.log(array);

/*

Array(7) [ "Akira", "John", "john", "john", "john", "Risa", "risa" ]

*/

追記 2023年6月1日(木)
上記コードを結果が同じで、sortメソッドを1回だけ使って実現できるように修正する。


const array = ["Risa", "john", "John", "john", "john", "Akira", "risa"];

array.sort((a, b) => {
  const lowerA = a.toLowerCase();
  const lowerB = b.toLowerCase();

  if (lowerA < lowerB) {
    return -1;
  } else if (lowerA > lowerB) {
    return 1;
  } else if (a < b) {
    return -1;
  } else if (a > b) {
    return 1;
  } else {
    return 0;
  }
});

console.log(array);

/*
Array(7) [ "Akira", "John", "john", "john", "john", "Risa", "risa" ]
*/

参考
Array.prototype.sort() ExternalLink

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*