Indizierung
Syntax
$list.indexBy($keyFun, $clashFun, $mapFun)
Beschreibung
Weist jedem Wert der Liste einen Schlüsselwert hinzu.
Im Gegensatz zur Gruppierung sind die Werte im resultierenden Wörterbuch keine Listen, sondern Einzelelemente. Daher müssen die berechneten Schlüsselwerte für die Elemente der Eingabemenge eindeutig sein. Über die Angabe einer optionalen clashFun können Schlüsselkonflikte aufgelöst werden. Zusätzlich kann durch Angabe einer mapFun bestimmt werden, welcher Wert für jeden Schlüssel im resultierenden Wörterbuch gespeichert wird.
Parameter
| Name | Typ | Beschreibung | Pflicht | Default |
|---|---|---|---|---|
| list | Menge | Eine Liste, die indiziert werden soll. | ja | |
| keyFun | Funktion | Schlüsselfunktion, nach der die Indizes erzeugt werden sollen. | ja | |
| clashFun | Funktion | Clashfunktion, nach der Key-Duplikate aufgelöst werden können. Ohne diese Funktion erzeugen Duplikate Fehlermeldungen. Wenn auch eine mapFun angegeben ist, erhält man die gemappten Werte, nicht die Originaleinträge aus der Liste. | nein | Keine Auflösung von Duplikaten. |
| mapFun | Funktion | Mapfunktion, welche die in der Liste gespeicherten Werte transformiert. Nimmt einen Parameter (das Listenelement) und gibt den zu speichernden Wert zurück. Die Transformation findet statt, nachdem die Schlüsselberechnung abgeschlossen ist. | nein | Originalwerte werden gespeichert. |
Rückgabewert
Typ: Fachobjekt
Ein Wörterbuch, in dem alle Werte der Liste einem Index zugeordnet sind.
Beispiele
Indizierung nach Namenskürzel
list("Smith Joe", "Parker Jane", "Taylor Tom", "Black Tyler", "Brown Erik")
.indexBy(keyFun: name -> $name.subString(0, 3))
Ausgabe: Ein Wörterbuch mit den Werten:
{
"Smi": "Smith Joe",
"Par": "Parker Jane",
"Tay": "Taylor Tom",
"Bla": "Black Tyler",
"Bro": "Brown Erik"
}
Aus jedem Namen werden die ersten 3 Buchstaben als Index verwendet.
Indizierung nach Namenskürzel mit Clash-Funktion
list("Smith Joe", "Parker Jane", "Brown Erik", "Taylor Tom", "Black Tyler", "Brook Ashley", "Browning Dave")
.indexBy(keyFun: name -> $name.subString(0, 3), clashFun: name1 -> name2 -> $name1 + " and " + $name2)
Ausgabe: Ein Wörterbuch mit den Werten:
{
"Smi": "Smith Joe",
"Par": "Parker Jane",
"Tay": "Taylor Tom",
"Bla": "Black Tyler",
"Bro": "Brown Erik and Brook Ashley and Browning Dave"
}
Die drei Namen "Brown Erik", "Brook Ashley", "Browning Dave" erhalten durch die Schlüsselfunktion dieselben Schlüssel. Ohne Clashfunktion würde eine Fehlermeldung herauskommen. In diesem Fall werden die Namen für den Key zusammengesetzt.
Indizierung nach Namenskürzel mit Clash-Funktion und Map-Funktion
[{"name": "Smith", "age": 45},
{"name": "Parker", "age": 32},
{"name": "Brown", "age": 28},
{"name": "Brown", "age": 35},
{"name": "Brown", "age": 33},
{"name": "Taylor", "age": 41}
].indexBy(
keyFun: person -> $person["name"],
clashFun: age1 -> age2 -> ($age1 + $age2) / 2,
mapFun: person -> $person["age"]
)
Ausgabe: Ein Wörterbuch mit den Werten:
{Smith=45.0, Parker=32.0, Brown=32.25, Taylor=41.0}
Die Namen werden als Schlüssel verwendet. Aus jedem Personen-Objekt wird das Alter extrahiert und als Wert gespeichert (mapFun). Falls mehrere Personen denselben Namen haben, werden die Alter paarweise gemittelt (clashFun).