2.7 אובייקטים תרגול
תרגול אובייקטים¶
תרגיל 1 - כרטיס אישי¶
צרו אובייקט person שמייצג אדם עם המאפיינים הבאים:
- שם (name)
- גיל (age)
- עיר (city)
- תחביבים (hobbies) - מערך של מחרוזות
- כתובת (address) - אובייקט מקונן עם רחוב (street), עיר (city), מיקוד (zip)
ואז:
1. הדפיסו את השם ואת העיר מתוך הכתובת
2. הוסיפו מאפיין email
3. הוסיפו תחביב חדש למערך התחביבים
4. שנו את המיקוד בכתובת
5. מחקו את מאפיין ה-age
6. הדפיסו את כל המפתחות של האובייקט
7. הדפיסו את כל הערכים של האובייקט
8. השתמשו ב-Object.entries כדי להדפיס כל מפתח וערך
תרגיל 2 - מתודות של אובייקט¶
צרו אובייקט bankAccount עם המאפיינים:
- שם הבעלים (owner)
- יתרה (balance) - מתחיל מ-0
- היסטוריית פעולות (history) - מערך ריק
ומתודות:
- deposit(amount) - הפקדה. מוסיפה לbalance ורושמת ב-history
- withdraw(amount) - משיכה. מורידה מbalance (רק אם יש מספיק כסף) ורושמת ב-history
- getBalance() - מחזירה את היתרה הנוכחית
- getHistory() - מחזירה את היסטוריית הפעולות
- printStatement() - מדפיסה דוח עם כל הפעולות והיתרה הנוכחית
בדקו את האובייקט:
bankAccount.deposit(1000);
bankAccount.deposit(500);
bankAccount.withdraw(200);
bankAccount.withdraw(2000); // should fail - not enough money
bankAccount.printStatement();
תרגיל 3 - מיזוג ועדכון¶
נתונים שני אובייקטים:
const defaultSettings = {
theme: "light",
language: "en",
fontSize: 14,
notifications: true,
autoSave: true
};
const userSettings = {
theme: "dark",
language: "he",
fontSize: 16
};
- צרו אובייקט
mergedSettingsשממזג את שני האובייקטים (הגדרות המשתמש דורסות את ברירות המחדל). השתמשו ב-spread. - צרו העתק של
mergedSettingsושנו בו את ה-theme בלי להשפיע על המקור - הוסיפו מאפיין
sidebar(אובייקט מקונן עםwidth: 250ו-visible: true) ל-mergedSettings - הקפיאו (freeze) את
defaultSettingsוודאו שלא ניתן לשנות אותו
תרגיל 4 - ספר טלפונים¶
צרו אובייקט phoneBook ריק ואז כתבו פונקציות:
addContact(phoneBook, name, phone)- מוסיפה איש קשרremoveContact(phoneBook, name)- מוחקת איש קשרfindContact(phoneBook, name)- מחזירה את מספר הטלפון (או הודעה שלא נמצא)updateContact(phoneBook, name, newPhone)- מעדכנת מספר טלפוןlistContacts(phoneBook)- מדפיסה את כל אנשי הקשר ממוינים לפי שםsearchContacts(phoneBook, query)- מחזירה את כל אנשי הקשר ששמם מכיל את ה-query (חיפוש חלקי, case-insensitive)
בדקו:
const phoneBook = {};
addContact(phoneBook, "Alice", "050-1234567");
addContact(phoneBook, "Bob", "052-9876543");
addContact(phoneBook, "Alice Smith", "054-1112222");
searchContacts(phoneBook, "alice"); // should find both Alice entries
תרגיל 5 - השוואת אובייקטים¶
כתבו פונקציה deepEqual(obj1, obj2) שבודקת אם שני אובייקטים שווים בתוכנם (deep comparison).
הפונקציה צריכה לטפל ב:
- ערכים פרימיטיביים (מספרים, מחרוזות, booleans)
- אובייקטים מקוננים
- מערכים
- null ו-undefined
deepEqual({ a: 1, b: 2 }, { a: 1, b: 2 }); // true
deepEqual({ a: 1, b: 2 }, { a: 1, b: 3 }); // false
deepEqual({ a: { b: 1 } }, { a: { b: 1 } }); // true
deepEqual({ a: [1, 2, 3] }, { a: [1, 2, 3] }); // true
deepEqual({ a: [1, 2, 3] }, { a: [1, 2, 4] }); // false
deepEqual(null, null); // true
deepEqual({ a: 1 }, { a: 1, b: 2 }); // false
תרגיל 6 - Optional Chaining¶
נתון אובייקט שמייצג תגובה מ-API:
const apiResponse = {
status: 200,
data: {
user: {
id: 1,
name: "Alice",
profile: {
avatar: "alice.jpg",
bio: "Developer"
},
posts: [
{ id: 101, title: "Hello World", comments: [{ text: "Nice!" }] },
{ id: 102, title: "JavaScript Tips", comments: [] }
]
}
}
};
השתמשו ב-optional chaining כדי לגשת בצורה בטוחה ל:
- שם המשתמש
- ה-avatar של המשתמש
- התגובה הראשונה של הפוסט הראשון
- הכותרת של הפוסט השלישי (לא קיים)
- מספר הטלפון של המשתמש (לא קיים)
- עיר המגורים (לא קיים - profile.address.city)
כל הגישות צריכות להחזיר undefined במקום לזרוק שגיאה כשהנתיב לא קיים.
תרגיל 7 - מערכת ניהול מלאי¶
כתבו מערכת ניהול מלאי בסיסית עם אובייקט inventory ופונקציות:
פונקציות:
1. addProduct(inventory, name, price, quantity) - מוסיפה מוצר למלאי
2. sellProduct(inventory, name, quantity) - מוכרת מוצר (מורידה מהכמות). מחזירה את הסכום שנגבה, או הודעת שגיאה אם אין מספיק במלאי
3. restock(inventory, name, quantity) - מוסיפה כמות למוצר קיים
4. getReport(inventory) - מחזירה אובייקט סיכום:
{
totalProducts: 5,
totalItems: 150,
totalValue: 25000,
outOfStock: ["Mouse"],
lowStock: ["Keyboard"] // less than 5 items
}
getMostExpensive(inventory)- מחזירה את המוצר היקר ביותרsearch(inventory, query)- מחפשת מוצרים לפי שם (חיפוש חלקי)
תרגיל 8 - טרנספורמציות אובייקטים¶
כתבו את הפונקציות הבאות:
invertObject(obj)- הופכת מפתחות וערכים:
pick(obj, keys)- מחזירה אובייקט חדש רק עם המפתחות שצוינו:
omit(obj, keys)- מחזירה אובייקט חדש בלי המפתחות שצוינו:
mapValues(obj, fn)- מפעילה פונקציה על כל ערך ומחזירה אובייקט חדש:
mapKeys(obj, fn)- מפעילה פונקציה על כל מפתח ומחזירה אובייקט חדש: