Aufgabe by PUW. Die folgenden Aufgaben wurde aus dem Repository von Koll. Schletz übernommen und um Tests ergänzt.
Die Datei stores.json ist eine JSON Datei, die - ähnlich wie Geizhals - verschiedene Shops speichert. Daneben gibt es eine Liste an Produkten. Die Produkte werden in Shops angeboten. Diese Angebote werden als Offer gespeichert.
Die Datei ist UTF-8 codiert (ohne Byte Order Mark).
Das folgende Diagramm zeigt die Struktur der Datei. Das oberste Objekt ist JsonRoot, es
repräsentiert die oberste Ebene der Datei.
Bearbeite die Datei aufgabe1.mjs
Die Datei kann mit npm run aufgabe1
ausgeführt werden.
Die Ausgabe muss der unten angezeigten Musterausgabe entsprechen.
Muster: Wie viele Stores sind in der Datei?
5
Muster: Produkte in der Kategorie Fantastic und EAN > 700000.
┌─────────┬────────┬─────────────────────────────┐
│ (index) │ ean │ name │
├─────────┼────────┼─────────────────────────────┤
│ 0 │ 729534 │ 'Unbranded Rubber Soap' │
│ 1 │ 733796 │ 'Tasty Steel Ball' │
│ 2 │ 985142 │ 'Handmade Wooden Bike' │
│ 3 │ 739896 │ 'Handcrafted Plastic Pizza' │
└─────────┴────────┴─────────────────────────────┘
(1) Stores in 1050 oder 1110 Wien.
┌─────────┬────────────────────────────────────────┬────────────────┬──────────────────────┬────────┬────────┐
│ (index) │ guid │ name │ address │ zip │ city │
├─────────┼────────────────────────────────────────┼────────────────┼──────────────────────┼────────┼────────┤
│ 0 │ '8e1bd9de-7cf5-be9b-f1e6-c8d4344317ec' │ 'Ertl KG' │ 'Im Dorf 87' │ '1050' │ 'Wien' │
│ 1 │ '02f18081-6afb-993b-5785-369331102393' │ 'Koszewski UG' │ 'Hallesche Str. 71c' │ '1110' │ 'Wien' │
└─────────┴────────────────────────────────────────┴────────────────┴──────────────────────┴────────┴────────┘
(2) PLZ mit Stores.
Set(5) { '1020', '1050', '1180', '1110', '1220' }
(3) Produkte, die vor dem 15. Februar 2021 hinzugefügt wurden.
┌─────────┬────────┬───────────────────────┬─────────────┐
│ (index) │ ean │ name │ category │
├─────────┼────────┼───────────────────────┼─────────────┤
│ 0 │ 283778 │ 'Rustic Soft Shirt' │ 'Fantastic' │
│ 1 │ 848527 │ 'Tasty Cotton Towels' │ 'Handmade' │
│ 2 │ 881282 │ 'Licensed Fresh Hat' │ 'Handmade' │
└─────────┴────────┴───────────────────────┴─────────────┘
(4) Preis des billigsten Angebotes des Produktes 246122 mit reduce
361.67
(5) Preis des billigsten Angebotes des Produktes 246122 mit Math.min()
361.67
(6) Maximaler und minimaler Preis der Produkte der Kategorie Handmade.
┌─────────┬────────┬────────────────────────────┬──────────┬──────────┐
│ (index) │ ean │ name │ minPrice │ maxPrice │
├─────────┼────────┼────────────────────────────┼──────────┼──────────┤
│ 0 │ 952530 │ 'Tasty Concrete Computer' │ 324.8 │ 921.91 │
│ 1 │ 848527 │ 'Tasty Cotton Towels' │ 802.25 │ 802.25 │
│ 2 │ 881282 │ 'Licensed Fresh Hat' │ 121.35 │ 890.91 │
│ 3 │ 964205 │ 'Practical Concrete Mouse' │ 344.84 │ 726.71 │
│ 4 │ 199829 │ 'Fantastic Fresh Towels' │ 147.77 │ 901.05 │
└─────────┴────────┴────────────────────────────┴──────────┴──────────┘
(7) Angebote der Kategorie Handmade.
┌─────────┬──────────┬────────────────────────────┬───────┐
│ (index) │ ean │ name │ count │
├─────────┼──────────┼────────────────────────────┼───────┤
│ 0 │ '199829' │ 'Fantastic Fresh Towels' │ 4 │
│ 1 │ '848527' │ 'Tasty Cotton Towels' │ 1 │
│ 2 │ '881282' │ 'Licensed Fresh Hat' │ 3 │
│ 3 │ '952530' │ 'Tasty Concrete Computer' │ 3 │
│ 4 │ '964205' │ 'Practical Concrete Mouse' │ 3 │
└─────────┴──────────┴────────────────────────────┴───────┘
In .NET 6 wurden 2 Funktionen eingeführt: MinBy() und MaxBy(). Sie ermitteln das Minimum bzw. das Maximum von Elementen einer Collection. Dabei werden 2 Dinge berücksichtigt:
- Es wird eine Collection zurückgegeben, die alle minimalen bzw. maximalen Elemente enthält. Das
ist notwendig, da z. B. das Array
[3,2,1,3,1]
zwei minimale Elemente ([1, 1]
) und zwei maximale Elemente ([3, 3]
) enthält. - Die Methoden besitzen einen Parameter, nämlich einen keySelector. Er ist eine Funktion, die
aus einem Element den zu vergleichenden Wert zurückliefert. Dadurch können auch komplexe
Elemente verglichen werden. Dadurch lassen sich die kleinsten Elemente des folgenden Arrays
bestimmen:
[{id: 1, temp: 2}, {id: 2, temp: 3}, {id: 3, temp: 2}]
. Mit dem keySelectorx => x.temp
kann die Temperatur als Vergleichskriterium herangezogen werden. Das Ergebnis von MinBy wäre dann[{id: 1, temp: 2}, {id: 3, temp: 2}]
.
Das Problem lässt sich mit einem Statement - nämlich einer reduce() Funktion lösen. Füge deinen Code in die Musterdatei aufgabe2.mjs ein. Die Implementierung darf keine Abhängigkeiten vom Aufbau der Arrayelemente haben und muss auch für das oben beschriebene Beispiel funktionieren.
results.minBy(r => r.points)
┌─────────┬────────────┬────────┬───────┐
│ (index) │ name │ points │ grade │
├─────────┼────────────┼────────┼───────┤
│ 0 │ 'Bernhard' │ 13 │ 2 │
│ 1 │ 'Nina' │ 13 │ 2 │
└─────────┴────────────┴────────┴───────┘
results.maxBy(r => r.points)
┌─────────┬──────────┬────────┬───────┐
│ (index) │ name │ points │ grade │
├─────────┼──────────┼────────┼───────┤
│ 0 │ 'Max' │ 16 │ 1 │
│ 1 │ 'Sophie' │ 16 │ 1 │
└─────────┴──────────┴────────┴───────┘
results.minBy(r => r.grade)
┌─────────┬──────────┬────────┬───────┐
│ (index) │ name │ points │ grade │
├─────────┼──────────┼────────┼───────┤
│ 0 │ 'Max' │ 16 │ 1 │
│ 1 │ 'Tobias' │ 14 │ 1 │
│ 2 │ 'Sophie' │ 16 │ 1 │
│ 3 │ 'Laura' │ 14 │ 1 │
└─────────┴──────────┴────────┴───────┘
results.maxBy(r => r.grade)
┌─────────┬────────────┬────────┬───────┐
│ (index) │ name │ points │ grade │
├─────────┼────────────┼────────┼───────┤
│ 0 │ 'Bernhard' │ 13 │ 2 │
│ 1 │ 'Nina' │ 13 │ 2 │
└─────────┴────────────┴────────┴───────┘
Es wird jest zum Testen verwendet. Das Setup erfolgt:
npm install
Das Programm selber kann mit folgendem Befehl gestartet werden:
npm run start
# für Aufgabe 1
npm run aufgabe1
node aufgabe1.mjs
# für Aufgabe 2
npm run aufgabe2
node aufgabe2.mjs
Anschließend können die Tests mit folgendem Befehl durchlaufen werden:
npm run test