はじめに
この記事を読めば、JavaScriptでソートをマスターすることができるようになります。
初心者でも分かりやすいように、JavaScriptのソート機能の使い方、対処法、注意点、カスタマイズ方法を10個のサンプルコードを交えて徹底解説します。
●JavaScriptソートの基本
JavaScriptでは、配列のソートを行うためにArray.prototype.sort()
関数を使用します。
この関数は、配列の要素を引数として渡された比較関数に基づいてソートします。
比較関数が指定されない場合は、要素を文字列に変換し、それらの文字列のUnicodeポイントの順序に従ってソートします。
○配列のソート
JavaScriptで配列をソートする方法をいくつかのサンプルコードで見ていきましょう。
●サンプルコード1:昇順でソート
const numbers = [3, 1, 4, 2];
numbers.sort((a, b) => a - b);
console.log(numbers); // [1, 2, 3, 4]
このサンプルコードでは、数値の配列numbers
を昇順でソートしています。
比較関数(a, b) => a - b
を使って、小さい値から大きい値へと並び替えています。
●サンプルコード2:降順でソート
const numbers = [3, 1, 4, 2];
numbers.sort((a, b) => b - a);
console.log(numbers); // [4, 3, 2, 1]
このサンプルコードでは、数値の配列numbers
を降順でソートしています。
比較関数(a, b) => b - a
を使って、大きい値から小さい値へと並び替えています。
●サンプルコード3:オブジェクト配列のソート
const people = [
{ name: 'Alice', age: 30 },
{ name: 'Bob', age: 25 },
{ name: 'Charlie', age: 35 }
];
people.sort((a, b) => a.age - b.age);
console.log(people);
// [{ name: 'Bob', age: 25 }, { name: 'Alice', age: 30 }, { name: 'Charlie', age: 35 }]
このサンプルコードでは、オブジェクトの配列people
をソートしています。
比較関数(a, b) => a.age - b.age
を使って、age
プロパティの値に基づいて昇順で並び替えています。
●サンプルコード4:数値のソート
const numbers = [10, 2, 30, 4];
numbers.sort();
console.log(numbers); // [10, 2, 30, 4]
このサンプルコードでは、比較関数を指定しないで配列numbers
をソートしています。
しかし、比較関数が指定されない場合、要素は文字列に変換され、Unicodeポイントの順序に従ってソートされるため、期待通りにソートされません。
●サンプルコード5:文字列のソート
const fruits = ['apple', 'banana', 'kiwi', 'mango'];
fruits.sort();
console.log(fruits); // ['apple', 'banana', 'kiwi', 'mango']
このサンプルコードでは、文字列の配列fruits
をソートしています。
比較関数を指定しない場合、文字列要素はそのままUnicodeポイントの順序に従ってソートされます。
●サンプルコード6:日付のソート
const dates = [
new Date(2023, 3, 10),
new Date(2022, 11, 12),
new Date(2021, 5, 18),
new Date(2023, 1, 22)
];
dates.sort((a, b) => a - b);
console.log(dates);
// [2021-06-18, 2022-12-12, 2023-02-22, 2023-04-10]
このサンプルコードでは、日付の配列dates
をソートしています。
比較関数(a, b) => a - b
を使って、日付の昇順で並び替えています。
●サンプルコード7:カスタム比較関数を用いたソート
const words = ['apple', 'Apples', 'Banana', 'banana'];
words.sort((a, b) => a.localeCompare(b, 'en', { sensitivity: 'base' }));
console.log(words); // ['apple', 'Apples', 'banana', 'Banana']
このサンプルコードでは、カスタム比較関数a.localeCompare(b, 'en', { sensitivity: 'base' })
を使って、文字列の大文字と小文字を区別せずにソートしています。
●サンプルコード8:安定ソート
const people = [
{ name: 'Alice', age: 30 },
{ name: 'Bob', age: 25 },
{ name: 'Charlie', age: 30 }
];
people.sort((a, b) => a.age - b.age || a.name.localeCompare(b.name));
console.log(people);
// [{ name: 'Bob', age: 25 }, { name: 'Alice', age: 30 }, { name: 'Charlie', age: 30 }]
このサンプルコードでは、安定ソートを実現しています。
age
プロパティが同じ場合、name
プロパティで比較します。結果として、ソート前後で同じage
を持つ要素の順序が維持されます。
●サンプルコード9:ソートアルゴリズムをカスタマイズ
function bubbleSort(arr, compareFunc) {
let swapped;
do {
swapped = false;
for (let i = 0; i < arr.length - 1; i++) {
if (compareFunc(arr[i], arr[i + 1]) > 0) {
[arr[i], arr[i + 1]] = [arr[i + 1], arr[i]];
swapped = true;
}
}
} while (swapped);
return arr;
}
const numbers = [3, 1, 4, 2];
bubbleSort(numbers, (a, b) => a - b);
console.log(numbers); // [1, 2, 3, 4]
このサンプルコードでは、バブルソートアルゴリズムをカスタマイズして、配列numbers
を昇順でソートしています。
カスタムソートアルゴリズムbubbleSort
には、比較関数(a, b) => a - b
を渡して使用します。
●サンプルコード10:配列を逆順にソート
const numbers = [1, 2, 3, 4];
numbers.reverse();
console.log(numbers); // [4, 3, 2, 1]
このサンプルコードでは、配列numbers
を逆順にソートしています。
JavaScriptのreverse
メソッドを使用して、配列の要素を簡単に逆順に並べ替えることができます。
●注意点と対処法
配列の破壊的操作に注意
JavaScriptのsort
メソッドは、元の配列を破壊的に変更します。
これを避けるには、slice
メソッドで配列のコピーを作成してからソートすることができます。
const originalArray = [3, 1, 4, 2];
const sortedArray = originalArray.slice().sort((a, b) => a - b);
console.log(originalArray); // [3, 1, 4, 2]
console.log(sortedArray); // [1, 2, 3, 4]
文字列の自然なソート順序に注意
JavaScriptでは、デフォルトで文字列が辞書順でソートされます。
これは、数値や日付などのデータタイプに問題を引き起こすことがあります。
適切な比較関数を使用して、データタイプに応じたソートを行ってください。
安定ソートの保証
JavaScriptのsort
メソッドは、安定ソートを保証していません。
安定ソートが必要な場合は、カスタム比較関数を使用して順序を維持するようにしてください。
大文字と小文字の扱い
大文字と小文字を区別しないソートが必要な場合は、localeCompare
メソッドを使用してカスタム比較関数を作成してください。
まとめ
この記事では、JavaScriptで配列をソートする方法として、基本的な使い方から応用例までを詳しく解説しました。
さらに、注意点や対処法についても触れました。
これで、JavaScriptで配列をソートする方法について理解し、実際にコードを書く際に役立てることができるようになりました。
適切な比較関数を使用して、データタイプやソート条件に応じたソートを実現できることでしょう。
また、注意点や対処法を把握することで、より堅牢なコードを書くことができます。