IIJmio(みおふぉん)

連想配列、多重配列のソート関数ライブラリ Hash

連想配列はそのままではソートができないので、普通の配列の親を作ってその子供(プロパティ)化けてソートします。 、同じような式を使う物なので、使っていた物を掲載しておきます。
DOM時代に入ってからはXMLも含めてオブジェクトを扱う事が非常に多いので、コアのArrayオブジェクトに用意されていても良さそうな物ですが・・・・。

1次元のキー&バリューのペアだけでなく連想配列が多重(多次元)配列の場合でも、 特定のプロパティを指定して、それを基準にソートする事も可能です。
ベタな関数なので、もっと良い物があればそっちを使ってください。

連想配列のソート方法は ==> チップス メモ 連想配列のソートの仕方を参照。



ソースファイル


ソースはエラーチェックなしの物と、エラーチェックありの物があります。
エラーチェックで倍のデータ量になるので両方置きました。どちらでも使いやすい方を。 (ちなみに私は完成までエラーチェックあり、完成後に置き換えています。というか部分使用ですが・・・)

■ File DownLoad  =>    hashsort.zip  

hash.js(エラーチェックあり) と hash_no_error.js(エラーチェックあり) が入っています。
WindowsのShift_JIS記述です。


使い方

■基本情報

var ステートメントでのオブジェクトにしてあるので、スクリプトをスクリプトの冒頭に記述して読み込ませるか、 使用するスクリプトよりも先に外部ソースファイルとして読み込ませてください。
関数内に記述してローカル変数(オブジェクト)として読み込ませる事もできます。

変数名はHash というオブジェクト名しかグローバルでは使っていませんので、他のプログラムと干渉しにくいはずです。 書き出しのvar Hash = の部分
Hashと言う名前が他の変数や関数名とぶつかる場合は別の名前に変更可能です。


Hashオブジェクト 簡単な説明
次のようなメソッドを持たせてあります。(詳しい解説は後半)
kvsort [ 戻り値:ソート後の連想配列 ]
変数 = Hash.kvsort( オブジェクト [,比較対象 [,スイッチ(true|false)]] )

例:Array = Hash.kvsort(Array,'key')
比較対象は 'key'(キーソート)、'val'(バリューソート)、'特定位置のvalue'(多重配列用比較要素ソート)、の方法があります。


reverse [ 戻り値:リバース後の連想配列 ]
変数 = Hash.reverse( オブジェクト [,スイッチ(true|false)] )
例:Array = Hash.reverse(Array)
key & valueのペアを保持したまま正反対の並び順に並べ替えます。

grep [ 戻り値:マッチした物だけを集めた配列 ]
変数 = Hash.grep(オブジェクト ,match()用パターン [,type])
例:grepary = Hash.grep(Array,/^regs/,'val')
typeは与えられたオブジェクトの'key'か'val'の対象を指定。

length [ 戻り値:連想配列の長さ(数値型) ]
変数 = Hash.length(連想配列)
例:len = Hash.length(Array)
空要素まで含めた長さを示す数が数値型で戻ります。

list [ 戻り値:連想配列のキーリスト、バリューリストの配列 ]
変数 = Hash.list(オブジェクト [,type])
例:keys = Hash.list(Array,'key')
例:values = Hash.list(Array,'val')
キーだけ、要素だけ、の配列(indexを持つ普通の配列)を返してきます。
スイッチは対象として 'key' か 'val' だけです。

toIndextype [ 戻り値:index型新配列のkeyとvalプロパティになった配列 ]
変数 = Hash.toIndextype(連想配列)
例:nArray = Hash.toIndextype(Array)
AAA['xxxx'] = 'zzzz';が BBBB[0].key = 'xxxx'; BBBB[0].val = 'zzzz'
のようにindexを持つBBBBという新しい親配列のオブジェクト要素 key(固定プロパティ名)とval(固定プロパティ名)になったもの。
基本的に内部用関数で、外からも一応使えるようにしてあるだけです。

toHashtype [ 戻り値:toIndextypeの逆 ]
変数 = Hash.toHashtype(2重配列[,スイッチ])
例:nArray = Hash.toHashtype(Array)
toIndextypeで作られた配列、または key(固定名)とval(固定名)という2つのプロパティだけを持つオブジェクトを AAAA[key] = val; という単純な連想配列に戻します。
BBBB[0].key = 'xxxx'; BBBB[0].val = 'zzzz'; を AAA['xxxx'] = 'zzzz';にした配列を返します。 toIndextypeの逆処理です。

コアのArrayのメソッドの様に Array.sort()とするだけで処理が済む物ではなく、 Array = Hash.property(Array);とする事で自分に返す、または新しい配列を作る形で使います。
Arrayやオブジェクトにprototypeでメソッドを埋め込むと、連想配列のキーと干渉するのでこうしてあります。
オブジェクト式の記述がわかる方は、Hashを H にしてkvsortを s の様に書き換えてしまえば H.s()の様に縮めて使えます。


詳細説明


kvsort

reverse

grep

list

toIndextype

toHashtype



専用ページから申し込むと
So-netより高い3万円CB

案ずるより産むが易し
使ってみれば疑問も解決

XREA+ (plus) 206円/月
( お試し7日間 )

CORE SERVER 428円/月
( お試し15日間 )

ロリポップ 270円/月
( お試し期間10日間 )

ヘテムル 1620円/月
( お試し期間15日間 )

さくら 129円/月
( お試し期間2週間 )

無駄な高額ドメイン管理料金払ってませんか?

バリュードメイン
ムームードメイン