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 = { david: 1500, joanne: 100, }; 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 // durch was das Loop geht. Besser als nur "el" für ein Element in dem Feld zu definieren, entry 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);