この翻訳は不完全です。英語から この記事を翻訳 してください。

配列の要素をin placeソートします。このソートは stable ではありません(訳注:同じ序列を持つ値の順番が保証されません)。 デフォルトではUnicodeコードポイントの昇順にソートされます。

このソートで消費されるCPU時間やメモリスペースは実装に依存するので、ここで言及することは出来ません。

構文

arr.sort([compareFunction])

引数

compareFunction Optional
ソート順を定義する関数を指定します。省略された場合、配列は各要素の文字列比較に基づき辞書順にソートされます。

戻り値

ソートされた結果の配列。ソートは対象配列上で直接行われることに注意して下さい。コピーされた別の配列が準備されることはありません。

説明

compareFunction (比較関数) が与えられなかった場合、要素はそれぞれの文字列に変換したものを比較して辞書 (あるいは電話帳。数的でない) 順にソートされます。例えば、"80" は辞書順では "9" の前に来ますが、数的なソートでは 9 が 80 の前に来ます。

compareFunction が与えられた場合、配列の要素は比較関数の返り値に基づきソートされます。もし ab が比較されようとしている要素の場合、

  • compareFunction(a, b) が 0 未満の場合、ab より小さい添字にソートします。
  • compareFunction(a, b) が 0 を返す場合、ab は互いに変更せず、他のすべての要素に対してソートします。注意: ECMAScript 標準はこの振る舞いを保証していないため、一部のブラウザ (例えば、遅くとも 2003 年以前のバージョンの Mozilla) はこれを遵守していません。
  • compareFunction(a, b) が 0 より大きい場合、ba より小さい添字にソートします。
  • compareFunction(a, b) に与えられた引数が同じなら戻り値も同じでなければなりません。もし一貫性のない値を返した場合の挙動は未定義となります。

よって、比較関数は以下のような形式をもちます。

function compare(a, b) {
  if (ある順序の基準において a が b より小) {
     return -1;
  }
  if (その順序の基準において a が b より大) {
     return 1;
  }
  // a は b と等しいはず
  return 0;
}

文字列の代わりに数字を比較する場合、比較関数は単純に a から b を引けばよいでしょう。次のように比較関数を定義すれば昇順に並べることが出来ます(InfinityNaNがなければですが)。

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

比較関数には関数式クロージャを使うと便利です。

var numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
  return a - b;
});
console.log(numbers);

// [1, 2, 3, 4, 5]

オブジェクトはプロパティの値の1つを指定して並べ替えることができます。

var items = [
  { name: 'Edward', value: 21 },
  { name: 'Sharpe', value: 37 },
  { name: 'And', value: 45 },
  { name: 'The', value: -12 },
  { name: 'Magnetic', value: 13 },
  { name: 'Zeros', value: 37 }
];

// 値順にソート
items.sort(function (a, b) {
  return a.value - b.value;
});

// 名前順にソート
items.sort(function(a, b) {
  var nameA = a.name.toUpperCase(); // 大文字と小文字を無視する
  var nameB = b.name.toUpperCase(); // 大文字と小文字を無視する
  if (nameA < nameB) {
    return -1;
  }
  if (nameA > nameB) {
    return 1;
  }

  // names must be equal
  return 0;
});

例: 配列を生成し、表示し、ソートする

以下の例は 4 つの配列を生成し、元の配列を表示したのちに、ソートした配列を表示します。数値の配列は比較関数なしでソートされたのち、比較関数ありでソートされます。

var stringArray = ['Blue', 'Humpback', 'Beluga'];
var numericStringArray = ['80', '9', '700'];
var numberArray = [40, 1, 5, 200];
var mixedNumericArray = ['80', '9', '700', 40, 1, 5, 200];

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

// 再び、print 関数が定義されているとして
console.log('stringArray:', stringArray.join());
console.log('ソート結果:', stringArray.sort());

console.log('numberArray:', numberArray.join());
console.log('比較関数なしのソート結果:', numberArray.sort());
console.log('compareNumbers でのソート結果:', numberArray.sort(compareNumbers));

console.log('numericStringArray:', numericStringArray.join());
console.log('比較関数なしのソート結果:', numericStringArray.sort());
console.log('compareNumbers でのソート結果:', numericStringArray.sort(compareNumbers));

console.log('mixedNumericArray:', mixedNumericArray.join());
console.log('比較関数なしのソート結果:', mixedNumericArray.sort());
console.log('compareNumbers でのソート結果:', mixedNumericArray.sort(compareNumbers));

この例は以下のような出力をもたらします。出力結果が示すように、比較関数が使われた場合、数値はそれが数値か数字の文字列かにかかわらず正しくソートされます。

stringArray: Blue,Humpback,Beluga
ソート結果: Beluga,Blue,Humpback

numberArray: 40,1,5,200
比較関数なしのソート結果: 1,200,40,5
compareNumbers でのソート結果: 1,5,40,200

numericStringArray: 80,9,700
比較関数なしのソート結果: 700,80,9
compareNumbers でのソート結果: 9,80,700

mixedNumericArray: 80,9,700,40,1,5,200
比較関数なしのソート結果: 1,200,40,5,700,80,9
compareNumbers でのソート結果: 1,5,9,40,80,200,700

非ASCII文字のソート

非ASCII文字、つまりアクセント記号付き文字(e, é, è, a, ä など)を含む文字列をソートする場合、英語以外の文字列は String.localeCompare を使用してください。この関数は、それらの文字を比較して正しい順序で表示することができます。

var items = ['réservé', 'premier', 'cliché', 'communiqué', 'café', 'adieu'];
items.sort(function (a, b) {
  return a.localeCompare(b);
});

// items は ['adieu', 'café', 'cliché', 'communiqué', 'premier', 'réservé']

Sorting with map

The compareFunction can be invoked multiple times per element within the array. Depending on the compareFunction's nature, this may yield a high overhead. The more work a compareFunction does and the more elements there are to sort, the wiser it may be to consider using a map for sorting. The idea is to walk the array once to extract the actual values used for sorting into a temporary array, sort the temporary array and then walk the temporary array to achieve the right order.

// ソートする配列
var list = ['Delta', 'alpha', 'CHARLIE', 'bravo'];

// temporary array holds objects with position and sort-value
var mapped = list.map(function(el, i) {
  return { index: i, value: el.toLowerCase() };
})

// sorting the mapped array containing the reduced values
mapped.sort(function(a, b) {
  if (a.value > b.value) {
    return 1;
  }
  if (a.value < b.value) {
    return -1;
  }
  return 0;
});

// container for the resulting order
var result = mapped.map(function(el){
  return list[el.index];
});

仕様

Specification Status Comment
ECMAScript 1st Edition (ECMA-262) 標準 初期定義。
ECMAScript 5.1 (ECMA-262)
Array.prototype.sort の定義
標準  
ECMAScript 2015 (6th Edition, ECMA-262)
Array.prototype.sort の定義
標準  
ECMAScript Latest Draft (ECMA-262)
Array.prototype.sort の定義
ドラフト  

ブラウザ実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeEdge MobileAndroid 版 FirefoxAndroid 版 OperaiOS 版 SafariSamsung InternetNode.js
基本対応Chrome 完全対応 1Edge 完全対応 ありFirefox 完全対応 1IE 完全対応 5.5Opera 完全対応 ありSafari 完全対応 ありWebView Android 完全対応 ありChrome Android 完全対応 ありEdge Mobile 完全対応 ありFirefox Android 完全対応 4Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 ありnodejs 完全対応 あり

凡例

完全対応  
完全対応

関連情報

ドキュメントのタグと貢献者

タグ: 
このページの貢献者: yuta0801, atomer, woodmix, teoli, ethertank, Fajrovulpo, Mgjbot, Yuichirou
最終更新者: yuta0801,