Kolikrát jste při pokusu o vložení objektu do sdíleného objektu obdrželi chybu„Nepodporovaný typ hodnoty ve sdíleném objektu„?
Co jste udělali? Napsali jste delší kód, abyste z nevinného objektu udělali sdílený, třeba iterací přes všechny jeho vlastnosti?
Co třeba přenést sdílený objekt z jedné sdílené skupiny do druhé?
Zajímavá věc o objektech: už víte, že je lze použít jako hashovací mapu (systém klíč/hodnota), ale co takhle získat všechny klíče nebo všechny hodnoty pomocí jediného řádku kódu?
Čtěte dál, protože 4D v18 R3 je venku a přináší dobré zprávy!
KOPÍROVÁNÍ sdílených objektů a kolekcí
kopírování objektu jako sdíleného
Na adrese OB Copy() příkaz byl rozšířen o novou volbu, která může mít hodnotu: ck shared
V následujícím příkladu je objekt $person zkopírován jako sdílený objekt do objektu $copy.
Poté můžeme objekt $copy vložit do sdíleného objektu $personsList .
C_OBJECT$copy ($person;$copy;$personsList)
C_TEXT ($text)
$text :=Document to text(Get 4D folder(Current resources folder)+"person.txt")
//$person is a standard object
$person :=JSON Parse($text)
$personsList :=New shared object()
//$copy is a shared object
$copy :=OB Copy($person;ck shared)
Use ($personsList)
//We can put $copy in $personsList because $copy is a shared object
$personsList .person:= xml-ph-003
End use
přiřadit sdílený objekt ze sdílené skupiny jinému objektu.
Na adrese OB Copy() byl také rozšířen o nový parametr: groupWith (což musí být sdílený objekt nebo sdílená kolekce).
Předání parametru groupWith umožňuje umístit kopírovaný objekt do stejné sdílené skupiny jako groupWith.
V následujícím příkladu patří $sharedObj a $sharedColl do dvou různých sdílených skupin.
Nemůžeme vložit $sharedObj do $sharedColl, aniž bychom dostali chybu, ale můžeme snadno zkopírovat $sharedObj do nového objektu patřícího do stejné sdílené skupiny jako $sharedColl.
C_OBJECT($sharedObj;$objCopy)
C_COLLECTION ($sharedColl)
//$sharedObj belongs to a shared group
$sharedObj :=New shared object("příjmení"; "Smith"; "adresa";New shared object("město"; "New York"))
//$sharedColl belongs to another shared group
$sharedColl :=New shared collection(New shared object("příjmení"; "Brown"))
//$objCopy is in the same shared group as $sharedColl
$objCopy:=OB Copy($sharedObj;ck shared;$sharedColl)
//So we can put $objCopy into $sharedColl without error
Use ($sharedColl)
$sharedColl .
push($objCopy)
End use
A co sdílené sbírky?
Výše uvedené příklady se týkají příkazu OB Copy() příkazu.
Přesně stejným způsobem byla vylepšena metodacollection.copy() member.
zpracovávat objekt jako hashovací mapu
K dispozici jsou nové příkazy, které usnadňují manipulaci s objektem jako s hashovací mapou. Pokud máte objekty, jejichž názvy vlastností obsahují dynamické údaje, jsou tyto příkazy určeny právě vám!
Vysvětlíme si to na jednom příkladu.
Uvažujme tento objekt $persons obsahující jako název vlastnosti jméno a jako hodnotu vlastnosti věk:
C_OBJECT($persons)
$persons :=New object
$persons ["John"]:=42 // John is 42
$persons ["Andy"]:=24 // Andy is 24
$persons ["Mary"]:=30 // Mary is 30
$persons ["Paul"]:=50 // Paul is 50
$persons ["Fred"]:=51// Fred is 51
Příkaz OB Keys
Tento příkaz vrací názvy vlastností objektu jako kolekci:
ALERT("There are "+String(OB Keys($persons).length)+" osoby")
Příkaz OB Values
Tento příkaz vrací hodnoty vlastností objektu jako kolekci:
ALERT("Věkový průměr je "+String(OB Values($persons).average()))
Příkaz OB Entries
Tento příkaz vrací kolekci objektů s klíčovými vlastnostmi (název vlastnosti) a hodnotou (hodnota vlastnosti):
C_COLLECTION($agesOK)
$agesOK:=OB Entries($persons).query("hodnota>:1";45)
ALERT ("Existují "+String($agesOK.length)+" osoby, které jsou starší 45 let.")
ALERT ("Jejich jména jsou: "+$agesOK.extract("klíč").join("-"))
Použití objektu, jak je uvedeno výše, umožňuje rychlý a přímý přístup k datům, podobně jako při použití indexu.
Je to rychlejší než použití kolekce objektů s vlastnostmi jméno a věk.
Všimněte si také, že tyto příkazy vracejí kolekci. To nám umožňuje používat všechny členské metody dostupné pro kolekce (jako např. average(), query(), …).