Maps mit Arrays (Map in Array in Map)

  • Hey, ich habe angefangen, mehr Maps zu verwenden und gefällt mir ganz gut. Aber ich bin jetzt in einem Fall etwas ratlos, wie man damit umgeht oder ob da eine Grenze von Maps ist:

    Ich habe eine große Map mit vielen Einträgen, einer davon ist ein Array mit einer Liste an dazugehörenden Einträgen und diese Einträge haben wieder Eigenschaften, die ich über eine Map lösen wollte. (Ich könnte natürlich einfach "große Map -> 2D-Array" machen, aber hätte die Eigenschaften gerne vom Handling wieder über eine Map gelöst)

    Ist etwas abstrakt, daher mal Code, um das Problem zu zeigen:


    Der erste Teil läuft, ist ja recht klar. Aber ich möchte ja das ganze Array ablegen (2. Teil) und da bekomme ich "Variable must be of type "Object".". Habe auch schon verschiedene andere Konstellationen versucht, das Array erst zwischenzuspeichern und dann wieder in die Map schreiben zu wollen, etc. Aber ich kriege die Konstellation nicht zum Laufen.

    Was ich dann noch machen wollen würde, ist die Map im Array zu erweitern, irgendwie so in der Art (auch verschiedene Konstellationen versucht):

    Code
    $mData.parts[0]["otherOtherValue"] = "otherOther"


    Lässt sich das irgendwie machen oder sollte ich es nicht so kompliziert machen und statt so zu verschachteln (was ich wegen dem Map-Handling machen wollen würde) einfach 2D-Arrays in der Map nutzen?

  • Die Variante mit dem verschachtelten Direktzugriff klappt primär zum Auslesen der Werte.
    Den genauen Mechanismus dahinter habe ich jetzt nicht parat aber es werden - zumindest in deinem Fall - auf dem Weg Kopien der einzelnen Datenstrukturen erzeugt.
    Man gibt also nicht einen Pfad auf den man schreibt an, sondern liest erst etwas aus und versucht das zu beschreiben.
    Also kurz: Auslesen auf diese verschachtelte Art: Ok - Beschreiben in dieser Syntax - nicht ok.

    Um dennoch ohne viel manuelles auslesen und wiederbeschreiben von Unterobjekten Werte in tiefen verschachtelten Ebenen zu verändern, habe ich mal hierfür eine Funktion geschrieben.
    Diese findest du in der JSON-UDF, da man in diesem Umfeld häufig mit heftig verschachtelten Datenstrukturen zu tun hat.
    Mit dieser würde man dein Beispiel folgendermaßen beheben können:

  • Danke dir, das ist schade... Wenn ich dann da wieder ein Array speichern will, dann klappt das mit der UDF auch nicht mehr. Mache mich ja schon echt unflexibel mit Maps, wenn die hier an ihre Grenzen kommen, hmmm...

    Habe es auch mal mit einem 2D-Array in einer Map versucht. Da geht auslesen auch problemlos, aber beim Schreiben gibt es die gleichen Probleme... Also bei komplexeren Daten dann wohl doch wieder zum Array zurück...^^

  • Danke dir, das ist schade... Wenn ich dann da wieder ein Array speichern will, dann klappt das mit der UDF auch nicht mehr.

    Doch natürlich kannst du dort ein Array speichern:

    AutoIt
    Global $aArray[] = [1,2,3]
    _JSON_addChangeDelete($mData, "parts[0].einArray", $aArray)

    Aktuell kann diese Funktion nicht mit 2D-Arrays umgehen, da es diese im JSON-Umfeld schlicht nicht gibt. Kann man aber auch noch implementieren zur Not (hab ich bei der _JSON_Get() gemacht)

    Mache mich ja schon echt unflexibel mit Maps, wenn die hier an ihre Grenzen kommen,

    Maps sind nicht unflexibler als Arrays. Bei verschachtelten Arrays verhalten sich diese genauso wie verschachtelte Maps.

  • Doch natürlich kannst du dort ein Array speichern:

    Ahh.... Hatte

    Code
    _ArrayDisplay($mData.parts[0].otherValue)

    versucht. Aber so ging es dann:

    Code
    $aTemp = $mData.parts[0].otherValue
    _ArrayDisplay($aTemp)


    Maps sind nicht unflexibler als Arrays. Bei verschachtelten Arrays verhalten sich diese genauso wie verschachtelte Maps.

    Hm, vielleicht habe ich auch etwas falsch gemacht... Aber meine Versuche, eine Map in eine Zwischen-Variable abzuspeichern, um dann etwas da rein schreiben zu können und die Map wieder im Array abzulegen, das bei meinen Versuchen nicht geklappt.

    2 Mal editiert, zuletzt von aSeCa (15. März 2024 um 19:14)