4D には、オブジェクトのコレクションを扱うための強力な機能があります。
たとえば、都市とそれに関連する国や大陸のコレクションを作成することができます。このようなコレクションを、.sort()、.order()、.filter() のようなビルトイン関数で操作するのは簡単です。
4D v20 R3 では、並べ替え処理を簡素化するために、新しい multiSort() 関数が導入されました。この関数を使うことで、複数コレクションの同期ソートが可能です。
新しい関数
この新しい multiSort() 関数を使用すると、複数のコレクションに対して複数レベルの同期ソートを実行できます。
この関数を引数なしで呼び出すと、.sort() 関数と同じ結果が得られます。デフォルトでは、コレクションは型に従って昇順にソートされます (スカラー値のみ)。
昇順以外の順序でコレクションをソートしたい場合は、フォーミュラを指定する必要があります:
$col.multiSort( [ $col2 ; $col3 ] )
$col.multiSort( $formula; [$col2 ; $col3] )
複数レベルの同期ソートを定義することも可能です。これは SORT MULTIPLE ARRAY コマンドに似ています。
この場合には、collection属性と order属性を含むオブジェクトを渡します。
$col.multiSort( [ {collection: $col2; order: ck ascending} ; $col3 ] )
$col.multiSort( $formula; [ {collection: $col2; order: ck ascending} ; $col3 ] )
この関数は、安定性のあるソートアルゴリズムを使用します。つまり、同じ値を持つ 2つの要素は、入力データと同じ順序で、ソート後の出力データに現れます。
例
都市 (city)、国 (country)、大陸 (continent) の例に戻りましょう:
var $city : Collection
var $country : Collection
var $continent : Collection
$city:=["Paris"; "Lyon"; "Rabat"; "Eching"; "San Diego"]
$country:=["France"; "France"; "Morocco"; "Germany"; "US"]
$continent:=["Europe"; "Europe"; "Africa"; "Europe"; "America"]
例1: 最初のコレクション ($continent) の単純なソートと、他のコレクション ($country と $city) の同期ソート:
$continent.multiSort([$country; $city])
結果は次のようになります:
"Africa"; "America"; "Europe"; "Europe"; "Europe" "Morocco"; "US"; "France"; "France"; "Germany" "Rabat"; "San Diego"; "Paris"; "Lyon"; "Eching"
例2: 1番目と3番目のコレクション ($continent と $city) の昇順ソートと、2番目のコレクション ($country) の同期ソート:
$continent.multiSort([$country; {collection: $city; order: ck ascending}])
結果は次のようになります:
"Africa"; "America"; "Europe"; "Europe"; "Europe" "Morocco"; "US"; "France"; "France"; "Germany" "Rabat"; "San Diego"; "Lyon"; "Paris"; "Eching"
例3: 最初のコレクション ($continent) のフォーミュラによるソートと、他のコレクション ($country と $city) の同期ソート
この例のフォーミュラは簡単で、降順にソートします。しかし、ニーズに合わせて、もっと複雑なフォーミュラも使用できます。
$continent.multiSort(Formula($1.value>$1.value2); [$country; $city])
結果は次のようになります:
"Europe"; "Europe"; "Europe"; "America"; "Africa" "France"; "France"; "Germany"; "US"; "Morocco" "Paris"; "Lyon"; "Eching"; "San Diego"; "Rabat"
例4: 複雑なコレクション
オブジェクトのコレクションを同期させるために使うこともできます:
var $name : Collection
var $address : Collection
$name:=[]
$name.push({firstname: "John"; lastname: "Smith"})
$name.push({firstname: "Alain"; lastname: "Martin"})
$name.push({firstname: "Jane"; lastname: "Doe"})
$name.push({firstname: "John"; lastname: "Doe"})
$address:=[]
$address.push({city: "Paris"; country: "France"})
$address.push({city: "Lyon"; country: "France"})
$address.push({city: "Eching"; country: "Germany"})
$address.push({city: "Berlin"; country: "Germany"})
$name.multiSort(Formula($1.value.firstname<$1.value2.firstname); [$address])
結果は次のようになります:
"Alain Martin"; "Jane Doe"; "John Smith"; "John Doe" "Lyon France"; "Eching Germany"; "Paris France"; "Berlin Germany"
次は…
詳細については、ドキュメントを参照ください。フォーラムでフィードバックや使用例を共有することができます。