Ga naar hoofdinhoud

Werken met lijsten

SHIPM8 breidt Handlebars uit met een set array-helpers. Verschillende daarvan zijn block helpers — ze creëren een nieuwe binnenste context in plaats van een waarde inline terug te geven, en moeten worden afgesloten met {{/helperName}}.


Een lijst filteren

arrayFilter is een block helper die een array filtert tot alleen de elementen die overeenkomen met een opgegeven zoekterm.

arrayFilter array filterTerm property partialSearch
ArgumentTypeBeschrijving
arrayarrayDe te filteren array.
filterTermstringDe waarde om op te filteren.
propertystringDe objecteigenschap om te controleren (alleen nodig voor arrays van objecten).
partialSearchbooleanOptioneel: true staat gedeeltelijke overeenkomsten toe.

Voorbeeld — exacte overeenkomst

{{#arrayFilter portCalls 'Rotterdam' 'port'}}
{{#each this}}{{eta}} {{/each}}
{{/arrayFilter}}

Gegevens:

{
"portCalls": [
{ "port": "Rotterdam", "eta": "2024-03-10" },
{ "port": "Antwerp", "eta": "2024-03-13" },
{ "port": "Rotterdam", "eta": "2024-03-18" }
]
}

Resultaat: 2024-03-10 2024-03-18

Voorbeeld — gedeeltelijke overeenkomst

{{#arrayFilter portCalls 'dam' 'port' 'true'}}
{{#each this}}{{port}} {{/each}}
{{/arrayFilter}}

Resultaat: Rotterdam Amsterdam


Een item opzoeken

arrayFind is een block helper die precies zoals arrayFilter werkt, maar alleen het eerste overeenkomende element teruggeeft.

arrayFind array filterTerm property partialSearch
ArgumentTypeBeschrijving
arrayarrayDe te doorzoeken array.
filterTermstringDe te zoeken waarde.
propertystringDe objecteigenschap om te controleren (alleen nodig voor arrays van objecten).
partialSearchbooleanOptioneel: true staat gedeeltelijke overeenkomsten toe.

Voorbeeld

{{#arrayFind portCalls 'Hamburg' 'port'}}
{{eta}}
{{/arrayFind}}

Gegevens: dezelfde portCalls-array als hierboven, met Hamburg toegevoegd → Resultaat: alleen de ETA voor Hamburg.


Items groeperen

groupBy is een block helper die een array groepeert op basis van een of meer eigenschappen. Er zijn drie uitvoermodi: items (standaard), count en sum.

groupBy array property action actionField decimalSeparator isPropertyJsonPath
ArgumentTypeBeschrijving
arrayarrayDe te groeperen array.
propertystringEigenschap (of door komma's gescheiden lijst) om op te groeperen. Sleutels worden samengevoegd met _ bij groepen op meerdere eigenschappen.
actionstringOptioneel: items (standaard), count of sum.
actionFieldstringOptioneel: veld om op te sommeren (vereist bij sum).
decimalSeparatorstringOptioneel: decimaalscheidingsteken bij het verwerken van sum-waarden.
isPropertyJsonPathbooleanOptioneel: behandel property als een JSON path-expressie (bijv. vessel.type).

Uitvoervormen:

items  →  [{ "key": string, "items": any[] }]
count → [{ "key": string, "count": number }]
sum → [{ "key": string, "sum": number }]

Voorbeeld — groeperen op haven (items)

{{#groupBy portCalls 'port'}}
{{#each this}}
{{key}}: {{#each items}}{{eta}} {{/each}}
{{/each}}
{{/groupBy}}

Resultaat:

Rotterdam: 2024-03-10 2024-03-18
Antwerp: 2024-03-13
Hamburg: 2024-03-15

Voorbeeld — aantal aanloopbewegingen per haven tellen

{{#groupBy portCalls 'port' 'count'}}
{{#each this}}{{key}}: {{count}}
{{/each}}
{{/groupBy}}

Resultaat:

Rotterdam: 2
Antwerp: 1
Hamburg: 1

Voorbeeld — tonnage sommeren per ladingtype

{{#groupBy shipments 'cargoType' 'sum' 'tonnage'}}
{{#each this}}{{key}}: {{sum}} MT
{{/each}}
{{/groupBy}}

Gegevens:

{
"shipments": [
{ "cargoType": "Crude Oil", "tonnage": 50000 },
{ "cargoType": "Crude Oil", "tonnage": 30000 },
{ "cargoType": "Iron Ore", "tonnage": 75000 },
{ "cargoType": "LNG", "tonnage": 20000 }
]
}

Resultaat:

Crude Oil: 80000 MT
Iron Ore: 75000 MT
LNG: 20000 MT

Voorbeeld — groeperen op meerdere eigenschappen

{{#groupBy shipments 'cargoType,vessel' 'sum' 'tonnage'}}
{{#each this}}{{key}}: {{sum}} MT
{{/each}}
{{/groupBy}}

Resultaat: Crude Oil_Ocean Star: 50000 MT enz. (sleutel is de waarden samengevoegd met _).

Voorbeeld — groeperen op geneste eigenschap (JSON path)

{{#groupBy shipments 'vessel.type' '' '' '' 'true'}}
{{#each this}}{{key}}: {{items.length}} shipment(s)
{{/each}}
{{/groupBy}}

Gegevens:

{
"shipments": [
{ "vessel": { "type": "Tanker" }, "cargo": "Crude Oil" },
{ "vessel": { "type": "Tanker" }, "cargo": "LNG" },
{ "vessel": { "type": "Bulker" }, "cargo": "Iron Ore" }
]
}

Resultaat:

Tanker: 2 shipment(s)
Bulker: 1 shipment(s)

Een lijst sorteren

sortedArray is een block helper die een array sorteert. Je hebt altijd een binnenste #each nodig om het resultaat af te drukken.

sortedArray array sortField sortNumeric formats
ArgumentTypeBeschrijving
arrayarrayDe te sorteren array.
sortFieldstringVeld(en) om op te sorteren, gescheiden door komma's. Zet een ! voor een veld om aflopend te sorteren.
sortNumericbooleanOptioneel: true voor numerieke sortering (standaard is tekstsortering).
formatsstringOptioneel: door komma's gescheiden .NET-formatstrings (één per sorteerveld) die vóór de vergelijking worden toegepast.

Voorbeeld — sorteren op één veld

{{#sortedArray portCalls 'eta'}}
{{#each this}}
- {{port}} {{eta}}
{{/each}}
{{/sortedArray}}

Resultaat (oplopende ETA):

- Amsterdam 2024-03-08
- Rotterdam 2024-03-10
- Hamburg 2024-03-15
- Antwerp 2024-03-18

Voorbeeld — sorteren op meerdere velden

{{#sortedArray shipments 'cargoType,!tonnage'}}
{{#each this}}{{cargoType}} {{tonnage}} | {{/each}}
{{/sortedArray}}

Sorteert op cargoType oplopend, daarna op tonnage aflopend binnen elke groep.

Voorbeeld — numerieke sortering

Standaard wordt er als tekst gesorteerd ("9" staat na "10"). Geef 'true' mee als derde argument voor een numerieke sortering.

{{#sortedArray shipments 'tonnage' 'true'}}
{{#each this}}{{vessel}}: {{tonnage}} | {{/each}}
{{/sortedArray}}

Samenvoegen tot tekst

Voegt array-elementen samen tot één string met een scheidingsteken. Optioneel kan een benoemd veld uit elk object worden geëxtraheerd.

join array separator fieldName
ArgumentTypeBeschrijving
arrayarrayDe samen te voegen array.
separatorstringString die tussen elk element wordt geplaatst.
fieldNamestringOptioneel: veld om uit elk object te extraheren. Opzoeken is hoofdletterongevoelig.

Voorbeeld

{{join ports ', '}}                    => Amsterdam, Rotterdam, Antwerp
{{join portCalls ' → ' 'port'}} => Amsterdam → Rotterdam → Antwerp

Elementen tellen (lengte)

Geeft het aantal elementen in een array terug.

arrayLength array
ArgumentTypeBeschrijving
arrayarrayDe te tellen array.

Voorbeeld

{{arrayLength portCalls}}    => 4
{{arrayLength shipments}} => 3

Lijsten samenvoegen (concat)

arrayConcat is een block helper die twee of meer arrays samenvoegt tot één array in de binnenste context.

arrayConcat array1 array2 ...
ArgumentTypeBeschrijving
array1arrayDe eerste array.
array2arrayDe tweede (en eventuele verdere) samen te voegen array.

Voorbeeld

{{#arrayConcat northSeaCalls atlanticCalls}}
{{#each this}}{{port}} {{/each}}
{{/arrayConcat}}

Gegevens:

{
"northSeaCalls": [
{ "port": "Rotterdam" },
{ "port": "Hamburg" }
],
"atlanticCalls": [
{ "port": "Antwerp" },
{ "port": "Amsterdam" }
]
}

Resultaat: Rotterdam Hamburg Antwerp Amsterdam


Een object herhalen (vanuit object)

arrayFromObject is een block helper die een array aanmaakt van N kopieën van hetzelfde object — handig wanneer je een sjabloonelement wilt herhalen op basis van een numerieke veldwaarde.

arrayFromObject object occurrences
ArgumentTypeBeschrijving
occurrencesnumberAantal keren dat het object wordt herhaald in de uitvoerarray.

Voorbeeld

{{#arrayFromObject cargo cargo.containerCount}}
{{#each this}}
- Container ({{type}})
{{/each}}
{{/arrayFromObject}}

Gegevens: { "cargo": { "type": "Containers", "containerCount": 3 } } → produceert 3 identieke rijen.


Tekst splitsen in een lijst

split is een block helper die een string opsplitst in een array op basis van een of meer scheidingstekens.

split value delimiters keepEmpty
ArgumentTypeBeschrijving
valuestringDe te splitsen string.
delimitersstringEen string waarvan elk afzonderlijk teken als scheidingsteken wordt gebruikt.
keepEmptybooleanOptioneel: true houdt lege items bij. Standaard: false.

Voorbeeld

{{#split 'Amsterdam,Rotterdam,Antwerp' ','}}
{{#each this}}{{this}} {{/each}}
{{/split}}

Resultaat: Amsterdam Rotterdam Antwerp

{{#split 'Crude Oil;LNG|Iron Ore' ';|'}}
{{#each this}} {{this}}{{/each}}
{{/split}}

Resultaat: Crude Oil LNG Iron Ore