gorogoronyan FC2

JavaScript: データを並べ替える (ソート)

概略

データを一定の規則に従って並べ替える操作を ソート (sort) と言います。 配列 Array の sort() を使います。

ソートでは並べ替えの順番を決めるため大小比較を行います。

Array.sort() でソートする

Array.sort() で引数なしの場合は文字列の比較になります。 文字コードの値を見て文字コードの順に並べ替えます。 注意点として、 配列の要素が文字列ではなく数値の場合でも文字列に変換してソートします。

文字列も数値と同じように比較演算子 (<<= など) で大小を比較することができます。 例えば、あいうえお順や ABC 順に並べ替えることができます。
並べ替えは国語辞典などでも出てくる話ですが Array.sort() は文字コードの順に並べ替える点で少し異なります。
文字列の大小を比較する

Array.sort( コールバック ) でソートする

Array.sort() では引数にコールバックを指定することできます。 並べ替えの方法をユーザーが細かく制御できます。

array = array.sort( コールバック );

具体的には

array = array.sort( (a, b) => 大小比較の結果を数値で返す );

コールバックの戻り値は 数値 で返します。 論理値 (ture/false) ではない点に注意してください。

・コールバックの戻り値
  a と b が同じ場合は 0 を返す。この場合、並べ替えはしません。
  a よりも b の方が大きい ( a, b の順に並べたい ) 場合は 負の値 を返す。
  a よりも b の方が小さい ( b, a の順に並べたい ) 場合は 正の値 を返す。

コールバックで不等号の比較を行う場合は 論理値 true/false を返さないようにしてください。 論理値を返すと true = 1、false = 0 と見なされるので正しくソートできません。

・失敗 :論理値 true/false を返すとソートしません。
  array.sort( (a, b) => a > b );

・正常 :論理値ではなくて数値を返す。
  array.sort( (a, b) => a > b ? -1 : 1 );

文字列を String.localeCompare() で並べ替える

下は String.localeCompare() で文字列の大小比較を行ってソートするサンプルです。

数値の比較でソートする

配列の要素が文字列ではなく数値の場合でも array.sort() (引数のコールバックなし) では 数値の並べ替えではなく文字列の並べ替えになる 点に注意してください。

数値でソートする場合はコールバックで数値の差を返します。

// 配列の要素は数値です。文字列を混ぜないこと。
array = array.sort( (a, b) => a - b );  //アロー関数で数値の差を返す。

配列の要素に数値ではなく数字の文字列が混ざると つまらないトラブルの原因になるので注意してください。 文字列の数字は Numner(), parseInt(), parseFloat() などで数値に変換した後で計算します。
文字列を数値に変換する
データを正規化して処理する

2重配列のテキストデータをソートする (2023/12)

TestJS_sort_matrix01.html
2重配列のテキストを指定の列でソートする。
テキストを2重配列に分割する
ツールサンプル (1)

HTML 要素を並べ替える (2023/12)

上のソート処理を応用して HTML の li タグや table タグを並べ替えることもできます。 HTML 要素の削除・追加の処理が加わります。
HTML 要素を削除・移動する

TestJS_sort_table_tr01.html
table をソートする。指定の列 (td) の値を見て行をソートする。
HTML tableタグ: JavaScript (1)

関連: 手動操作で HTML 要素を並べ替える

こちらはこれまでの Array.sort() のソート処理とは別の話です。 Web ブラウザ上でマウス操作などで手動で HTML 要素をドラッグ移動させて並べ替える話です。
HTML 要素を削除・移動する
マウスイベント処理

TestJS_ul_li_drag01.html
li 要素をマウスのドラッグ移動の操作で並べ替える。 draggable 属性のサンプル。
li 要素を並べ替える

関連

inserted by FC2 system