"strict mode"; const budget = [ { value: 250, description: "Sold old TV 📺", user: "david" }, { value: -45, description: "Groceries 🥑", user: "david" }, { value: 3500, description: "Monthly salary 👩‍💻", user: "david" }, { value: 300, description: "Freelancing 👩‍💻", user: "david" }, { value: -1100, description: "New iPhone 📱", user: "david" }, { value: -20, description: "Candy 🍭", user: "joanne" }, { value: -125, description: "Toys 🚂", user: "joanne" }, { value: -1800, description: "New Laptop 💻", user: "david" }, ]; const spendingLimits = Object.freeze({ // damit macht man Objekt unveränderlich (IMMUTABLE) (aber Objekt wird unveränderlich nur im 1 Level des Objektes. // Objekte, die unter ein Objektes existieren, können geändert werden(damit wird nicht deepFreeze gemacht)) // Mit der Object freeze Methode Verwendung, kann man nach der Definierung des Objektes nicht mehr Eigenschaften hinzufügen david: 1500, joanne: 100, }); spendingLimits.eva = 200; // das wird wegen des Object-freeze Methode nicht funktionieren console.log(spendingLimits); // Das Objekt spendingLimits bleibt ungeändert const getLimit = user => spendingLimits?.[user] ?? 0; const addExpense = function (value, description, user = "david") { // if (!user) user = "david"; // statt einen solchen urprünglichen Wert in der if Anweisung zu erstellen, // es ist besser als einen urprünglichen Parameter in der Methode zu definieren const addExpense = function (value, description, user = "david") { user = user.toLowerCase(); // let lim; // if (spendingLimits[user]) { // lim = spendingLimits[user]; // } else { // lim = 0; // } // statt die If Anwesisungen zu definieren, ist es besser solche Bedienung als ternanry Operator zu definieren // const limit = spendingLimits[user] ? spendingLimits[user] : 0; // besseres Performance und einen schöneren Überblick aud den Code zu haben // dritte Möglicheit/oder noch bessere Lösung mit dem Optional Chaining (wird überprüft wenn spendingLimits[user] mehr als 0 ist/exixstiert, // wenn nicht wird automatisch der Wert 0 zugewissen, ohne das Optional Chaning Operator wäre der Wert undefined // const limit = spendingLimits[user]?.[user]; const limit = getLimit(user); // Verwendung der Methode, damit wird DRY(Don't repeat yourself) Prinzip werwendet if (value <= limit) { budget.push({ value: -value, description: description, user: user }); } }; addExpense(10, "Pizza 🍕"); addExpense(100, "Going to movies 🍿", "Matilda"); addExpense(200, "Stuff", "Jay"); const checkExpenses = function () { // der Name einer Methode check, zu wenig beschreibt, was sie eigentlich checkiert, // in unserem Fall wäre besser, checkExpenses, damit eindeutlich ist, was eigentlich diese Methode checkiert // Besser als nur "el" für ein Element in dem Feld zu definieren, entry definiieren, damit man weisst welche Role spielt ein Element, wenn for Loop durch das Feld geht for (const entry of budget) if (entry.value < -getLimit(entry.user)) entry.flag = "limit"; }; checkExpenses(); const logBigExpenses = function (bigLimit) { let output = ""; for (const entry of budget) output += entry.value <= -bigLimit ? entry.description.slice(-2) : ""; output = output.slice(0, -2); console.log(output); }; logBigExpenses(1);