[Javascript] Chromeではsortの挙動が異なる | パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

開発の解決方法や新しい手法の情報を、パークのエンジニアが提供します。パークのエンジニアが必要な場合は、ぜひお気軽にお問い合わせ下さい。 株式会社パーク:http://www.pa-rk.co.jp/

テーマ:

こんにちは!パーク社員のゆんぼうです。

Webアプリ開発のクロスブラウザ対応したときに注意したいことを紹介します。

今回は、Javascriptの「sort」関数についてです。

動作確認した環境

OS: Windows 10 Pro

ブラウザ名 バージョン
Google Chrome 62.0.3202.94
Mozilla Firefox 57.0
Microsoft Edge 41.16299.15.0
Microsoft Internet Explorer (IE11) 11.64.16229.0

sortとは

sortとは、配列を並び替える関数です。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

 

sortを実装したソースコードは以下の通りです。

list.sort(function (a, b) {
    if (a.value === b.value) {
        return 0;
    }
    if (a.value < b.value) {
        return -1;
    } else {
        return 1;
    }
});

sortの引数(function(a, b {...}の部分))は、compareFunction (比較関数)と呼ばれるものです。3種類の戻り値により、ソートが実行されます。

  「0」の場合は、a と b は並び変えない

  「0より小さい」の場合は、a は b の前に並び替える

  「0より大きい」の場合は、b は a の前に並び替える

 

この「0」の場合の戻り値について、Chromeでは正常に動作しません。

以下のデモページを表示してみてください。

 

【デモページはこちら】

【ソースファイルはこちら】

 

「source」カラムがソート前、「result」がソート後の結果です。この同じ値を持つ11個の配列をソートすると、比較関数の戻り値は0になるため、並び替えは発生しないはずです。しかし、Chromeでは並び替えが発生しています。

 

ECMAScript 5では仕様通りとなっています。(※コメントでご指摘いただきました。)

http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

22.1.3.25 Array.prototype.sort ( comparefn )
The elements of this array are sorted. The sort is not necessarily stable (that is, elements that compare
equal do not necessarily remain in their original order). 

日本語訳:
この配列の要素が、並べ替えられます(ソートされます)。 sortは、安定している必要はありません。(つまり、それは、等価性を比較する要素が、元の順番のままである必要はないということです。) 

ブラウザ毎のsortの挙動

クロスブラウザ対応で注意したいこととして、Chromeでは、同じ値をソートしたときに結果が異なります。

ブラウザ名 同じ値のソート
Google Chrome 安定していない
Mozilla Firefox 安定している
Microsoft Edge 安定している
Microsoft Internet Explorer (IE11) 安定している

 

以上です。