Wie oft haben Sie die Fehlermeldung„Not supported value type in a shared object“ erhalten, wenn Sie versucht haben, ein Objekt in ein gemeinsames Objekt zu setzen?
Was haben Sie dann getan? Haben Sie einen längeren Code geschrieben, um Ihr unschuldiges Objekt in ein gemeinsam genutztes Objekt zu verwandeln, vielleicht durch Iteration über alle Eigenschaften des Objekts?
Wie wäre es, ein gemeinsames Objekt von einer gemeinsamen Gruppe in eine andere zu übertragen?
Eine interessante Sache über Objekte: Sie wissen bereits, dass sie als Hash-Map (ein Schlüssel/Wert-System) verwendet werden können, aber wie wäre es, alle Schlüssel oder alle Werte mit einer einzigen Codezeile zu erhalten?
Lesen Sie weiter, denn 4D v18 R3 ist da und bringt gute Nachrichten!
COPY freigegebene Objekte und Sammlungen
Kopieren eines Objekts als Shared
Der Befehl OB Copy() Befehl wurde um eine neue Option erweitert, die den Wert: ck shared haben kann
Im folgenden Beispiel wird das Objekt $person als gemeinsames Objekt in das Objekt $copy kopiert.
Dann können wir das Objekt $copy in das gemeinsame Objekt $personsList kopieren.
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
ein gemeinsames Objekt aus einer gemeinsamen Gruppe einer anderen zuweisen
Der Befehl OB Copy() wurde außerdem um einen neuen Parameter erweitert: groupWith (der ein gemeinsames Objekt oder eine gemeinsame Sammlung sein muss).
Durch die Übergabe des groupWith-Parameters kann das kopierte Objekt in dieselbe gemeinsame Gruppe wie groupWith eingefügt werden.
In dem folgenden Beispiel gehören $sharedObj und $sharedColl zu zwei verschiedenen gemeinsamen Gruppen.
Wir können $sharedObj nicht in $sharedColl einfügen, ohne einen Fehler zu erhalten, aber wir können $sharedObj einfach in ein neues Objekt kopieren, das zur gleichen gemeinsamen Gruppe gehört wie $sharedColl.
C_OBJECT($sharedObj;$objCopy)
C_COLLECTION ($sharedColl)
//$sharedObj belongs to a shared group
$sharedObj :=New shared object("Nachname"; "Smith"; "Adresse";New shared object("Stadt"; "New York"))
//$sharedColl belongs to another shared group
$sharedColl :=New shared collection(New shared object("Nachname"; "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
Und was ist mit gemeinsamen Sammlungen?
Die obigen Beispiele beziehen sich auf den OB Copy() Befehl.
Die Member-Methodecollection.copy() wurde auf genau die gleiche Weise erweitert.
Behandlung eines Objekts als Hash-Map
Es gibt neue Befehle, die den Umgang mit einem Objekt als Hash-Map vereinfachen. Wenn Sie Objekte haben, deren Eigenschaftsnamen dynamische Daten enthalten, sind diese Befehle genau das Richtige für Sie!
Lassen Sie uns dies anhand eines Beispiels erklären.
Betrachten Sie dieses $persons Objekt, das Vornamen als Eigenschaftsnamen und Alter als Eigenschaftswert enthält:
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
Befehl OB Keys
Dieser Befehl gibt die Eigenschaftsnamen eines Objekts als Sammlung zurück:
ALERT("Es gibt "+String(OB Keys($persons).length)+" Personen")
OB-Werte-Befehl
Dieser Befehl gibt die Eigenschaftswerte eines Objekts als Sammlung zurück:
ALERT("Der Altersdurchschnitt ist "+String(OB Values($persons).average()))
Befehl OB-Einträge
Dieser Befehl gibt eine Sammlung von Objekten mit Schlüsseleigenschaften (Eigenschaftsname) und Wert (Eigenschaftswert) zurück:
C_COLLECTION($agesOK)
$agesOK:=OB Entries($persons).query("Wert>:1";45)
ALERT ("Es gibt "+String($agesOK.length)+" Personen, die über 45 sind")
ALERT ("Ihre Namen sind: "+$agesOK.extract("Schlüssel").join("-"))
Die Verwendung eines Objekts, wie oben gezeigt, ermöglicht einen schnellen, direkten Zugriff auf die Daten, wie bei der Verwendung eines Indexes.
Es ist schneller als die Verwendung einer Sammlung von Objekten mit den Eigenschaften Vorname und Alter.
Beachten Sie auch, dass diese Befehle eine Sammlung zurückgeben. Dies ermöglicht die Verwendung aller Methoden, die für Sammlungen verfügbar sind (wie average(), query(), …).