4D nabízí výkonné funkce pro práci s kolekcemi objektů. Můžete například vytvořit kolekci měst s přidruženými zeměmi a kontinenty. Manipulace s těmito kolekcemi pomocí vestavěných funkcí, jako je třídění, řazení a filtrování, se stává hračkou.
4D v20 R3 zavádí novou funkci multiSort(), která tento proces zjednodušuje. Pomocí této funkce nyní můžete snadno třídit a synchronizovat více kolekcí.
Nová funkce
Tato nová funkce multiSort() umožňuje provádět víceúrovňové synchronizované třídění na sadě kolekcí.
Pokud je funkce volána bez parametrů, má stejný účinek jako funkce .sort(). Kolekce je standardně seřazena (pouze skalární hodnoty) vzestupně podle jejich typu.
Pokud chcete kolekce seřadit v jiném než vzestupném pořadí, musíte zadat vzorec.
$col.multiSort( [ $col2; $col3 ] )
$col .multiSort( $formula; [$col2; $col3] )
Je také možné definovat víceúrovňové synchronizované třídění. To je podobné příkazu SORT MULTIPLE ARRAY.
V tomto případě je třeba předat objekt obsahující atributy kolekce a pořadí.
$col.multiSort( [ {collection: $col2; order: ck ascending} ; $col3 ] )
$col .multiSort( [ $formula; {collection: $col2; order: ck ascending} ; $col3 ] )
O třídicím algoritmu se navíc říká, že je stabilní, tj. dva prvky se stejnou hodnotou se v setříděném výstupu vyskytují ve stejném pořadí jako ve vstupním souboru dat.
Příklady
Vraťme se k našemu příkladu města, země a kontinentu:
var $city : Collection
var $country : Collection
var $continent : Collection
$city :=["Paříž"; "Lyon"; "Rabat"; "Eching"; "San Diego"]
$country :=["Francie"; "Francie"; "Maroko"; "Německo"; "USA"]
$continent :=["Evropa"; "Evropa"; "Afrika"; "Evropa"; "Amerika"]
Příklad 1: Jednoduché třídění první kolekce ($continent) se synchronizací dalších kolekcí ($country a $city).
$continent.multiSort([$country; $city])
Výsledkem je:
"Afrika"; "Amerika"; "Evropa"; "Evropa"; "Evropa". "Maroko"; "USA"; "Francie"; "Francie"; "Německo". "Rabat"; "San Diego"; "Paris"; "Lyon"; "Eching"
Příklad 2: Vzestupné třídění první a třetí kolekce ($continent a $city) a synchronizace pro druhou kolekci ($country).
$continent.multiSort($country; {collection: $city; order: ck ascending})
Výsledek je následující:
"Afrika"; "Amerika"; "Evropa"; "Evropa"; "Evropa". "Maroko"; "USA"; "Německo"; "Francie"; "Francie". "Rabat"; "San Diego"; "Eching"; "Lyon"; "Paris"
Příklad 3: Třídění vzorce první kolekce ($continent) a synchronizace pro další kolekce ($country a $city).
Vzorec v příkladu je přímočarý a umožňuje třídění sestupně. Pravděpodobně však máte spoustu nápadů na složitější vzorce, které vyhovují vašim potřebám.
$continent.multiSort(Formula($1.value>$1.value2); [$country; $city])
Výsledkem je:
"Evropa"; "Evropa"; "Evropa"; "Amerika"; "Afrika". "Francie"; "Francie"; "Německo"; "USA"; "Maroko". "Paris"; "Lyon"; "Eching"; "San Diego"; "Rabat"
Příklad 4: Se složitými kolekcemi
Můžete jej také použít k synchronizaci kolekcí objektů.
var $name : : :=[] . ({ : "John"; : "Smith"}) . ({ : "Alain"; : "Martin"}) . ({ : "Jane"; : "Doe"}) . ({ : "John"; : "Doe"}) :=[] .({ : "Paříž"; : "Francie"}) . ({ : "Lyon"; : "Francie"}) . ({ : "Eching"; : "Německo"}) . ({ : "Berlín"; : "Německo"}) . ( ( . . < . . ); [ ) Collection
var $address Collection
$name
$namepushfirstname lastname
$namepushfirstname lastname
$namepushfirstname lastname
$namepushfirstname lastname
$address
$addresspushcity country
$addresspushcity country
$addresspushcity country
$addresspushcity country
$namemultiSortFormula$1valuefirstname$1value2firstname$address]
Výsledek je následující:
"Alain Martin"; "Jane Doe"; "John Smith"; "John Doe". "Lyon Francie"; "Eching Německo"; "Paříž Francie"; "Berlín Německo".
Další…
Další informace naleznete v dokumentaci. O své připomínky a případy použití se můžete podělit na fóru.