Über alle Keys einer Map iterieren?

Hallo,

ich hab noch eine Auftragsfrage:

Für Aufträge aus Plenty bekomme ich in OrderItemsStorageLocationQuantity ja eine Map der Form "12345=1.0,67890=2.0" zurück (vermute ich).

Das sind die Lagerorte an denen ein Artikel für den Auftrag reserviert sind (hoffe ich).

Nun möchte ich prüfen ob ein Artikel an einem von einigen vordefinierten Lagerorten liegt die ich als kommaseparierte Liste vorliegen habe.

Also in etwa

<#if meta.meineLagerorte?split(",")?seq_contains(OrderItemsStorageLocationQuantity.keys())>tue etwas</#if>

wobei keys() dann alle Keys der Map zurückgeben würde. Tut es aber nicht ;-)


oder

Danke & Gruß,

Daniel

PS: Vielleicht habe ich auch eine brauchbarere Spalte mit den Lagerorten übersehen?


Alle Keys der Map: ?keys statt .keys

leider funktioniert ?seq_contains nicht so wie du das erwartest, da es nur einen einzigen Wert in der Liste suchen kann.


Aber du könntest dir die neuen Lambda-Ausdrücke wie ?filter zu nutze machen (seit ein paar Monaten in Freemarker).


Hier mal ein Beispiel:


${"1,2,3,4,5"?split(',')?filter(lager -> parseMap("2=foo;5=b")?keys?seq_contains(lager))?size}


Das gibt dir 2 aus. das bedeutet, dass es aus der Lagerortliste (1,2,3,4,5) auch zwei keys in der Map gibt (2 und 5).


Als IF/ELSE könnte man das schreiben:

<#if ("1,2,3,4,5"?split(',')?filter(lager -> parseMap("2=foo;5=b")?keys?seq_contains(lager))?size > 0)>mach etwas<#else>mach nichts</#if>


Jetzt muss du "1,2,3,4,5" und parseMap("2=foo;5=b") durch deine Variablen ersetzen.


Hier als ausprobierbares Beispiel.

Super, funktioniert!


Ihr habt ja schon ein echt gutes Produkt, aber erst durch den ebenso hochwertigen Support wird das ganze ein rundes Ding! Als ob ich die neuen Funktionen bei Freemarker aktiv verfolgen würde... ;-)


Vielen Dank,

Daniel

1 „Gefällt mir“

Hehe, das mit dem Hinweis auf die neuen Freemarker-Funktionen war nur konstruktiv gemeint, gerade weil die neu sind und die noch keiner so richtig kennt. Wir selbst beginnen erst ?filter() und ?map() zu nutzen. Aber dadurch kann man einige Dinge wesentlich kürzer und prägnanter formulieren als bisher.