/** * 🌐 JS 10: WEB STORAGE & JSON SERIALISIERUNG 🌐 * =============================================== * In diesem Modul lernst du, wie Daten dauerhaft im Browser * (localStorage & sessionStorage) als JSON persistiert werden. */ /** * Hilfsfunktion zum Auflösen des Speichers (Echter Storage oder Mock) * @param {Object} [storageMock=null] * @returns {Storage | Object | null} */ function ermittleStorage(storageMock = null) { if (storageMock) return storageMock; if (typeof localStorage !== "undefined") return localStorage; return null; } /** * 🎯 TEILZIEL 1 (TODO 1): speichereDaten(schluessel, daten, storageMock) * Serialisiert Daten zu einem JSON-String und speichert sie im Web Storage. * * Anforderungen: * - schluessel: string (muss ein nicht-leerer String sein, sonst TypeError) * - daten: Beliebige serialisierbare Daten (Objekt, Array, Zahl, Boolean, String) * - storageMock: Optionaler Storage-Ersatz für isolierte Tests * - Serialisiert `daten` mit JSON.stringify() * - Speichert mit storage.setItem(schluessel, jsonString) * - Fängt Speicherfehler (z.B. QuotaExceededError) ab und gibt false zurück * - Gibt bei Erfolg true zurück. * * @param {string} schluessel * @param {any} daten * @param {Object} [storageMock=null] * @returns {boolean} */ function speichereDaten(schluessel, daten, storageMock = null) { // TODO: Schlüssel validieren, JSON.stringify verwenden und in Storage schreiben return false; } /** * 🎯 TEILZIEL 2 (TODO 2): ladeDaten(schluessel, standardWert, storageMock) * Lädt Daten aus dem Storage und deserialisiert sie sicher von JSON. * * Anforderungen: * - schluessel: string * - standardWert: Rückfallwert (Default: null), falls Schlüssel nicht existiert oder defekt ist * - storageMock: Optionaler Storage-Ersatz * - Liest den Rohwert mit storage.getItem(schluessel) * - Falls der Schlüssel nicht existiert (getItem liefert null), gib `standardWert` zurück. * - Versucht JSON.parse() auf den Rohdaten. * - Bei SyntaxError (defektes JSON im Storage) fange den Fehler ab und gib `standardWert` zurück. * - Gibt die deserialisierten Daten zurück. * * @param {string} schluessel * @param {any} [standardWert=null] * @param {Object} [storageMock=null] * @returns {any} */ function ladeDaten(schluessel, standardWert = null, storageMock = null) { // TODO: storage.getItem abrufen, JSON.parse mit try/catch ausführen return standardWert; } /** * 🎯 TEILZIEL 3 (TODO 3): loescheDaten(schluessel, storageMock) * Entfernt einen Eintrag aus dem Storage. * * Anforderungen: * - schluessel: string (muss ein gültiger String sein) * - Ruft storage.removeItem(schluessel) auf. * - Gibt true zurück wenn erfolgreich, sonst false bei ungültigem Schlüssel. * * @param {string} schluessel * @param {Object} [storageMock=null] * @returns {boolean} */ function loescheDaten(schluessel, storageMock = null) { // TODO: storage.removeItem ausführen return false; } /** * @typedef {Object} HighscoreEintrag * @property {string} name - Name des Spielers * @property {number} punkte - Erzielte Punktzahl * @property {string} datum - ISO-Datumsstring */ /** * 🎯 TEILZIEL 4 (TODO 4): aktualisiereHighscore(spielerName, punkte, storageMock) * Verwaltet eine Highscore-Bestenliste unter dem Schlüssel "highscores". * * Anforderungen: * - spielerName: string (nach .trim() nicht leer, sonst TypeError werfen) * - punkte: number (muss Zahl >= 0 und !isNaN sein, sonst TypeError werfen) * - Lädt bestehende Highscores mit ladeDaten("highscores", [], storageMock). * - Erstellt neuen Eintrag: { name: spielerName.trim(), punkte: punkte, datum: new Date().toISOString() } * - Sortiert die Highscores absteigend nach `punkte` (höchste Punktzahl auf Index 0). * - Begrenzt die Liste auf die Top 10 Einträge. * - Speichert die aktualisierte Liste mit speichereDaten("highscores", liste, storageMock). * - Gibt das sortierte Array der HighscoreEintraege zurück. * * @param {string} spielerName * @param {number} punkte * @param {Object} [storageMock=null] * @returns {HighscoreEintrag[]} */ function aktualisiereHighscore(spielerName, punkte, storageMock = null) { // TODO: Highscores laden, neuen Eintrag einfügen, sortieren, begrenzen und speichern return []; }