2011年05月17日

JavaScriptのsort

JavaScriptで、配列の中身を並べ替えたいときはsort()を使います。

普通にソート
var array = ["bbb", "dddd", "aa", "c"];
array.sort();
alert(array);


上の例だと「aa」、「bbb」、「c」、「dddd」の順に表示されます。
アルファベット順(文字コードの順)に並べ替えられました。

次はこれを文字数の順に並べ替えます。
実は、sort()は「並べ替えのルール」を引数にとります。

並べ替えルールつきソート1
var array = ["bbb", "dddd", "aa", "c"];
array.sort(function(value1, value2) {
return value1.length - value2.length;
});
alert(array);


これで「c」、「aa」、「bbb」、「dddd」の順に表示されます。
sort()の引数はfunctionで、引数value1とvalue2はそれぞれ配列の要素を表します。
そして戻り値に関しては、
 正の数の場合:value1が先に並び、value2が後に並ぶ
 0の場合:value1とvalue2は同じ順番
 負の数の場合:value1が後に並び、value2が先に並ぶ
となります。

もう一つ、ありがちな例。
人物の年齢が高い順に並べます。

並べ替えルールつきソート2
var array = [
{Name: "ももこ", Age: 8},
{Name: "ひろし", Age: 40},
{Name: "すみれ", Age: 40},
{Name: "さきこ", Age: 11},
{Name: "ともぞう", Age: 76}
];
array.sort(function(value1, value2) {
return value2.Age - value1.Age;
});
for (var i = 0; i < array.length; i++) {
alert(array[i].Name);
}


ともぞう、ひろし、すみれ、さきこ、まるこ、の順に表示されたと思います。
父ひろしと母すみれは逆になってるかもしれません。

ところで父ひろしと母すみれは同い年ですが、順番はどうやって決まるのでしょう?
JavaScriptに限らずソートには安定・不安定という概念があります。
「並べ替えようとしたら順位が同じになってしまった場合、並べ替え前の順位に基づいて並べ替える」
ことを安定といいます。
同様に、
「並べ替えようとしたら順位が同じになってしまった場合、適当に(ソート処理の都合によって)並べ替える」
ことを不安定といいます。

JavaScriptのソートは安定、不安定のどちらなのでしょうか?
これがどうもブラウザによるみたいです。
試してみたところ、IE9とChrome12では安定です。
ソート順が不定だと困る場合は、ソート条件をきっちり指定するしかありません。
先の例だと、
「同い年の場合は名前の五十音順」
とかでしょうか。

ラベル:javascript
posted by ぺるたご at 00:38| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。