לדלג לתוכן

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
};
  1. צרו אובייקט mergedSettings שממזג את שני האובייקטים (הגדרות המשתמש דורסות את ברירות המחדל). השתמשו ב-spread.
  2. צרו העתק של mergedSettings ושנו בו את ה-theme בלי להשפיע על המקור
  3. הוסיפו מאפיין sidebar (אובייקט מקונן עם width: 250 ו-visible: true) ל-mergedSettings
  4. הקפיאו (freeze) את defaultSettings וודאו שלא ניתן לשנות אותו

תרגיל 4 - ספר טלפונים

צרו אובייקט phoneBook ריק ואז כתבו פונקציות:

  1. addContact(phoneBook, name, phone) - מוסיפה איש קשר
  2. removeContact(phoneBook, name) - מוחקת איש קשר
  3. findContact(phoneBook, name) - מחזירה את מספר הטלפון (או הודעה שלא נמצא)
  4. updateContact(phoneBook, name, newPhone) - מעדכנת מספר טלפון
  5. listContacts(phoneBook) - מדפיסה את כל אנשי הקשר ממוינים לפי שם
  6. 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 כדי לגשת בצורה בטוחה ל:

  1. שם המשתמש
  2. ה-avatar של המשתמש
  3. התגובה הראשונה של הפוסט הראשון
  4. הכותרת של הפוסט השלישי (לא קיים)
  5. מספר הטלפון של המשתמש (לא קיים)
  6. עיר המגורים (לא קיים - profile.address.city)

כל הגישות צריכות להחזיר undefined במקום לזרוק שגיאה כשהנתיב לא קיים.


תרגיל 7 - מערכת ניהול מלאי

כתבו מערכת ניהול מלאי בסיסית עם אובייקט inventory ופונקציות:

const 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
}
  1. getMostExpensive(inventory) - מחזירה את המוצר היקר ביותר
  2. search(inventory, query) - מחפשת מוצרים לפי שם (חיפוש חלקי)

תרגיל 8 - טרנספורמציות אובייקטים

כתבו את הפונקציות הבאות:

  1. invertObject(obj) - הופכת מפתחות וערכים:
invertObject({ a: 1, b: 2, c: 3 });
// { 1: "a", 2: "b", 3: "c" }
  1. pick(obj, keys) - מחזירה אובייקט חדש רק עם המפתחות שצוינו:
pick({ a: 1, b: 2, c: 3, d: 4 }, ["a", "c"]);
// { a: 1, c: 3 }
  1. omit(obj, keys) - מחזירה אובייקט חדש בלי המפתחות שצוינו:
omit({ a: 1, b: 2, c: 3, d: 4 }, ["b", "d"]);
// { a: 1, c: 3 }
  1. mapValues(obj, fn) - מפעילה פונקציה על כל ערך ומחזירה אובייקט חדש:
mapValues({ a: 1, b: 2, c: 3 }, (val) => val * 2);
// { a: 2, b: 4, c: 6 }
  1. mapKeys(obj, fn) - מפעילה פונקציה על כל מפתח ומחזירה אובייקט חדש:
mapKeys({ name: "Alice", age: 25 }, (key) => key.toUpperCase());
// { NAME: "Alice", AGE: 25 }