2.9 דסטרקצ׳רינג וספרד תרגול
תרגול דסטרקצ'רינג וספרד¶
תרגיל 1 - דסטרקצ'רינג בסיסי¶
בצעו את המשימות הבאות באמצעות דסטרקצ'רינג:
- חלצו את שלושת הצבעים הראשונים מהמערך:
const colors = ["red", "green", "blue", "yellow", "purple"];
// extract red, green, blue using destructuring
- חלצו רק את האלמנט השני והרביעי:
- חלצו name, age, ו-email מהאובייקט:
- חלצו את name ותנו ל-age ברירת מחדל של 18:
- חלצו את name ושנו את השם של המשתנה ל-userName:
- החליפו את הערכים של שני משתנים באמצעות דסטרקצ'רינג:
תרגיל 2 - דסטרקצ'רינג מקונן¶
חלצו ערכים מהאובייקטים הבאים באמצעות דסטרקצ'רינג:
- חלצו את שם העיר ואת שם המדינה:
const company = {
name: "TechCorp",
address: {
street: "Herzl 10",
city: "Tel Aviv",
country: "Israel"
}
};
- חלצו את שם המשתמש, את הציון הראשון, ואת שם העיר:
const student = {
name: "Alice",
grades: [95, 88, 72],
info: {
city: "Haifa",
school: "Tech High"
}
};
- חלצו נתונים מתשובת API:
const response = {
status: 200,
data: {
users: [
{ id: 1, name: "Alice" },
{ id: 2, name: "Bob" }
],
total: 2
}
};
// extract: status, first user's name, and total
תרגיל 3 - Rest ו-Spread עם מערכים¶
- השתמשו ב-rest כדי לקבל את האלמנט הראשון ואת כל השאר:
- אחדו שלושה מערכים למערך אחד באמצעות spread:
- צרו העתק של מערך והוסיפו אלמנט בהתחלה ובסוף:
- כתבו פונקציה
removeAt(arr, index)שמחזירה מערך חדש בלי האלמנט באינדקס הנתון (בלי splice, עם spread ו-slice):
תרגיל 4 - Rest ו-Spread עם אובייקטים¶
- צרו העתק של אובייקט עם מאפיין נוסף:
- השתמשו ב-rest כדי להסיר מאפיין מאובייקט (בלי delete):
const user = { name: "Alice", password: "secret", email: "alice@test.com" };
// create a new object without password
- מזגו שני אובייקטים כש-user דורס את defaults:
const defaults = { theme: "light", language: "en", fontSize: 14 };
const userPrefs = { theme: "dark", fontSize: 18 };
- כתבו פונקציה
updateObject(obj, updates)שמחזירה אובייקט חדש עם העדכונים:
const person = { name: "Alice", age: 25, city: "Tel Aviv" };
updateObject(person, { age: 26, email: "alice@test.com" });
// { name: "Alice", age: 26, city: "Tel Aviv", email: "alice@test.com" }
תרגיל 5 - דסטרקצ'רינג בפונקציות¶
- כתבו פונקציה
getFullName({ firstName, lastName })שמקבלת אובייקט ומחזירה שם מלא:
- כתבו פונקציה
calculateArea({ width, height, unit = "cm" })שמחשבת שטח ומחזירה מחרוזת:
calculateArea({ width: 10, height: 5 }); // "50 cm^2"
calculateArea({ width: 3, height: 4, unit: "m" }); // "12 m^2"
- כתבו פונקציה
createUser({ name, age = 18, role = "user", ...rest })שמחזירה אובייקט משתמש:
createUser({ name: "Alice", email: "alice@test.com", active: true });
// { name: "Alice", age: 18, role: "user", extra: { email: "alice@test.com", active: true } }
- כתבו פונקציה
printScores(name, ...scores)שמקבלת שם ומספר כלשהו של ציונים, ומדפיסה ממוצע:
תרגיל 6 - Shallow vs Deep Copy¶
- צרו אובייקט עם מערך מקונן ואובייקט מקונן. צרו העתקה רדודה ובדקו שהשינוי באובייקט המקונן משפיע על המקור:
const original = {
name: "Alice",
scores: [90, 85, 92],
address: { city: "Tel Aviv" }
};
// create shallow copy
// change scores[0] and address.city in the copy
// check: does it affect the original?
-
צרו העתקה עמוקה עם
structuredCloneובדקו שהשינויים לא משפיעים על המקור. -
צרו העתקה עמוקה עם
JSON.parse(JSON.stringify(...))ובדקו מה קורה כשיש: - פונקציה כמאפיין
- ערך undefined
- אובייקט Date
תרגיל 7 - דפוסים מעשיים¶
- כתבו פונקציה
mergeConfig(...configs)שמקבלת מספר כלשהו של אובייקטי קונפיגורציה ומחזירה אובייקט ממוזג (האחרון מנצח):
mergeConfig(
{ host: "localhost", port: 3000 },
{ port: 8080, debug: true },
{ debug: false, timeout: 5000 }
);
// { host: "localhost", port: 8080, debug: false, timeout: 5000 }
- כתבו פונקציה
pluck(arr, key)שמחלצת מאפיין מסוים ממערך של אובייקטים:
const users = [
{ name: "Alice", age: 25 },
{ name: "Bob", age: 30 },
{ name: "Charlie", age: 35 }
];
pluck(users, "name"); // ["Alice", "Bob", "Charlie"]
- כתבו פונקציה
immutableUpdate(obj, path, value)שמעדכנת ערך בנתיב מקונן בצורה immutable:
const state = {
user: {
name: "Alice",
address: { city: "Tel Aviv" }
}
};
immutableUpdate(state, ["user", "address", "city"], "Haifa");
// returns new object:
// { user: { name: "Alice", address: { city: "Haifa" } } }
// original state is unchanged
תרגיל 8 - תרגיל מסכם¶
נתון מערך של נתוני עובדים:
const employees = [
{ id: 1, name: "Alice", department: "Engineering", salary: 15000, skills: ["JavaScript", "React"] },
{ id: 2, name: "Bob", department: "Design", salary: 12000, skills: ["Figma", "CSS"] },
{ id: 3, name: "Charlie", department: "Engineering", salary: 18000, skills: ["Python", "Node.js"] },
{ id: 4, name: "Diana", department: "Marketing", salary: 11000, skills: ["SEO", "Analytics"] },
{ id: 5, name: "Eve", department: "Engineering", salary: 16000, skills: ["JavaScript", "TypeScript"] }
];
השתמשו בדסטרקצ'רינג, spread, rest, ומתודות מערכים כדי:
- חלצו את השם והמחלקה של העובד הראשון עם דסטרקצ'רינג
- צרו מערך חדש שבו לכל עובד יש מאפיין
bonusשווה ל-10% מהמשכורת (בלי לשנות את המקור) - צרו פונקציה
getEngineerNames(employees)שמחזירה שמות של כל מהנדסי התוכנה (השתמשו בדסטרקצ'רינג ב-callback) - צרו פונקציה
addSkill(employees, employeeId, newSkill)שמוסיפה מיומנות לעובד ומחזירה מערך חדש (immutable) - צרו פונקציה
transferEmployee(employees, employeeId, newDepartment, salaryChange)שמעבירה עובד למחלקה אחרת עם שינוי משכורת - הכל בצורה immutable - צרו פונקציה
getSummary(employees)שמחזירה סיכום: רשימה ייחודית של כל המיומנויות, ממוצע משכורות, ועובדים לפי מחלקה