以下のページで公開されているOrderedArray関数のライブラリを使うと、データの追加順序が保持されている連想配列を利用できる。
例を示しながら具体的に説明したい。三つのキーと値からなる連想配列をこのようにつくるとする。
Object("a", 30, "c", 20, "b", 10)
これらのキーと値を順番に表示してみよう。
For Key, Value in Object("a", 30, "c", 20, "b", 10) MsgBox,% Key . ", " . Value
結果は次のようなものだ。Forの処理がa,b,cのキーの順番で行われていることがわかる。
a, 30 b, 10 c, 20
このように、 AutoHotkey_L で連想配列を用いると意図しないキーの並び替えが生じてしまう。
そこで OrderdArray()を使ってみよう。
For Key, Value in OrderdArray("a", 30, "c", 20, "b", 10) MsgBox,% Key . ", " . Value
a, 30 c, 20 b, 10
キーを並び替えずに、データを追加した順序で値を取り出すことができた。
Object(...)とOrderdArray(...)のそれぞれの結果を比較してみよう。
MsgBox,% "arguments: (""a"", 30, ""c"", 20, ""b"", 10)`n`n" . "Object(...):`n" . getKeyAndValue(Object("a", 30, "c", 20, "b", 10)) . "`n" . "OrderedArray(...):`n" . getKeyAndValue(OrderedArray("a", 30, "c", 20, "b", 10)) return getKeyAndValue(arr){ tmp := "" For Key, Value in arr tmp .= "`t" . Key . ", " . Value . "`n" return tmp }
データを追加した順序に従いキーの値に応じた処理をするときには、このOrderdArray()を活用することになるだろう。
ただし、重複するキーが存在する場面において、OrderdArray()を使ってもデータの追加順序が維持されないことに注意しなければならない。次の例では "c" にまず 10 を、それから 0 を紐付けているが、 Object(...) と OrderdArray(...) のどちらを用いても、メッセージボックスに表示されるのは c, 0 というテキストだ。
For Key, Value in Object("c", 10, "c", 0) MsgBox,% Key . ", " . Value For Key, Value in OrderedArray("c", 10, "c", 0) MsgBox,% Key . ", " . Value
これらをまとめてみよう。OrderdArray関数を利用すれば、データの追加順序が保持されている連想配列を利用できる。ただし、キーが重複している場合にはデータの追加順序が保持されなくなる。