/* 基本のソート:文字列の配列をUnicodeコードポイント順にソートする例 */
const enStrings = ["d", "b", "c", "a"];

enStrings.sort();
console.log(enStrings); // ["a", "b", "c", "d"]

/* コールバック関数を使用して数値の大きさ基準で昇順にソートする例 */
const numbers = [1, 4, 1000, 10, 31];

function compareNumbers(a, b) {
    return a - b;
}

numbers.sort(compareNumbers);
console.log(numbers); // [1, 4, 10, 31, 1000]
arr.sort();
arr.sort(compareFunction);
/* アルファベット配列のソート例 */
const enStrings = ["d", "b", "c", "a"];

enStrings.sort();
console.log(enStrings); // ["a", "b", "c", "d"]

/* 日本語配列のソート例 */
const jpStrings = ["う", "あ", "い"];

jpStrings.sort();
console.log(jpStrings); // ["あ", "い", "う"]
arr.sort();
arr.sort(compareFunction); // compareFunction (オプション): 引数にコールバック関数を渡して整列基準を指定
/**
 * コールバック関数
 *
 * @param a 比較する最初の要素です。undefinedになることはありません。
 * @param b 比較するための2番目の要素です。undefinedになることはありません。
 *
 * コールバック関数は名前付き関数(ユーザー定義関数)や匿名関数などで使用できます。
 * (当然ながら)すべてのコールバック関数はアロー関数として使用できます。
 */
compareFunction(a, b) {
    // aとbを比較するロジック: 比較結果を返さなければなりません。
}
const numbers = [1, 4, 1000, 10, 31];

function compareNumbers(a, b) {
    return a - b;
}

numbers.sort(compareNumbers);
console.log(numbers); // 出力: [1, 4, 10, 31, 1000]
const sparseArr = [3, , 1, undefined, 2];
sparseArr.sort();

console.log(sparseArr); 
// 出力例: [1, 2, 3, undefined, <1 empty slot>]
// undefined 値や値のない要素(疎な配列)は、整列結果において配列の末尾に位置します。
const arr = [3, , 1, undefined, 2];

function hasValue(value) {
    // undefined 値の要素を除去します。
    return value !== undefined;
}

/*
 * filter() は次のように動作します。
 *
 * 1. 疎な配列の空のスロットはコールバック関数が呼び出されないため、自動的に除外されます。
 * 2. undefined 値を持つ要素はコールバック関数の戻り値が false であるため、除外されます。
 */
const filteredArr = arr.filter(hasValue);

filteredArr.sort();

console.log(filteredArr); // [1, 2, 3]
const enStrings = ["A", "C", "B"];
enStrings.sort();
console.log(enStrings); // ["A", "B", "C"] 
const enStrings = ["A", "a", "B"];
enStrings.sort();
console.log(enStrings); // ["A", "B", "a"] -> 小文字の "a" が大文字の "B" より後ろに整列されています。
/* 数値配列を整列(ソート)する例:
   要素の数値を文字列として扱い、文字列の該当するUnicodeコードポイント順に整列 */
const numbers = [1, 1000, 4, 10, 31];
numbers.sort();

console.log(numbers); // 出力: [1, 10, 1000, 31, 4] <= 注意!! 文字列のように扱って整列される
const numbers = [1, 1000, 4, 10, 31];

function compareNumbers(a, b) {
    return a - b;
}

numbers.sort(compareNumbers);

console.log(numbers); // 出力: [1, 4, 10, 31, 1000]