2.6 מערכים מתודות מתקדמות תרגול
תרגול מתודות מתקדמות של מערכים¶
תרגיל 1 - פילטור וטרנספורמציה¶
נתון מערך של מוצרים:
const products = [
{ name: "Laptop", price: 4999, category: "electronics", inStock: true },
{ name: "Shirt", price: 89, category: "clothing", inStock: true },
{ name: "Phone", price: 3499, category: "electronics", inStock: false },
{ name: "Pants", price: 159, category: "clothing", inStock: true },
{ name: "Tablet", price: 1999, category: "electronics", inStock: true },
{ name: "Hat", price: 49, category: "clothing", inStock: false },
{ name: "Monitor", price: 1499, category: "electronics", inStock: true },
{ name: "Jacket", price: 299, category: "clothing", inStock: true }
];
כתבו את הפעולות הבאות (כל אחת בשורה אחת או שתיים באמצעות שרשור מתודות):
- קבלו מערך של שמות כל המוצרים שנמצאים במלאי (inStock === true)
- קבלו את סכום המחירים של כל המוצרים בקטגוריית electronics
- קבלו מערך של מוצרי ביגוד (clothing) ממוינים מהזול ליקר
- מצאו את המוצר הכי יקר שנמצא במלאי
- בדקו אם כל מוצרי האלקטרוניקה נמצאים במלאי
- בדקו אם יש לפחות מוצר אחד שעולה פחות מ-50
תרגיל 2 - סטטיסטיקות ציונים¶
נתון מערך של ציונים:
השתמשו במתודות מערכים (בלי לולאות רגילות) כדי:
- לחשב את הממוצע של כל הציונים
- למצוא את הציון הגבוה ביותר ואת הנמוך ביותר
- לספור כמה ציונים מעל 80
- ליצור מערך חדש שבו כל ציון מעוגל למעלה למכפלה של 5 הקרובה (למשל 82 -> 85, 67 -> 70)
- לקבל מערך של ציונים עוברים (55 ומעלה) ממוינים מהגבוה לנמוך
- לחלק את הציונים לקבוצות: "excellent" (90+), "good" (75-89), "average" (55-74), "failing" (מתחת ל-55) - השתמשו ב-
reduceאו ב-Object.groupBy
תרגיל 3 - עיבוד טקסט¶
נתון מערך של משפטים:
const sentences = [
" Hello World ",
"JavaScript is awesome",
" arrays ARE fun ",
"I love CODING",
" Practice makes PERFECT "
];
השתמשו בשרשור מתודות כדי:
- לנקות רווחים מיותרים (trim) ולהמיר הכל לאותיות קטנות
- לקבל מערך של כל המילים מכל המשפטים (flat array of words)
- לספור כמה פעמים כל מילה מופיעה (object שמפתחותיו הן המילים והערכים הם מספר ההופעות)
- למצוא את המשפט הכי ארוך (הכי הרבה תווים)
- לסנן רק משפטים שמכילים את המילה "is" או "are" (אחרי המרה לאותיות קטנות)
תרגיל 4 - ניהול משימות - Todo List¶
נתון מערך של משימות:
const todos = [
{ id: 1, text: "Learn JavaScript", completed: true, priority: "high" },
{ id: 2, text: "Build a project", completed: false, priority: "high" },
{ id: 3, text: "Read documentation", completed: false, priority: "medium" },
{ id: 4, text: "Practice coding", completed: true, priority: "high" },
{ id: 5, text: "Watch tutorial", completed: false, priority: "low" },
{ id: 6, text: "Write tests", completed: false, priority: "medium" },
{ id: 7, text: "Deploy app", completed: true, priority: "high" },
{ id: 8, text: "Fix bugs", completed: false, priority: "high" }
];
כתבו פונקציות שמקבלות את המערך ומחזירות:
getIncompleteTodos(todos)- מערך של כל המשימות שלא הושלמוgetHighPriorityIncomplete(todos)- מערך של משימות בעדיפות גבוהה שלא הושלמוgetCompletionRate(todos)- אחוז ההשלמה (מספר בין 0 ל-100)getTodosByPriority(todos)- אובייקט שמקבץ את המשימות לפי עדיפותgetFormattedList(todos)- מערך של מחרוזות בפורמט: "[x] Learn JavaScript (high)" או "[ ] Build a project (high)"sortByPriority(todos)- מערך ממוין לפי עדיפות (high -> medium -> low), בלי לשנות את המערך המקורי
תרגיל 5 - חנות מקוונת¶
נתון מערך של הזמנות:
const orders = [
{ id: 1, customer: "Alice", items: ["Laptop", "Mouse"], total: 5200, date: "2024-01-15" },
{ id: 2, customer: "Bob", items: ["Phone"], total: 3500, date: "2024-01-20" },
{ id: 3, customer: "Alice", items: ["Keyboard", "Monitor"], total: 2100, date: "2024-02-01" },
{ id: 4, customer: "Charlie", items: ["Tablet", "Case", "Charger"], total: 2800, date: "2024-02-10" },
{ id: 5, customer: "Bob", items: ["Headphones"], total: 350, date: "2024-02-15" },
{ id: 6, customer: "Alice", items: ["Webcam"], total: 250, date: "2024-03-01" },
{ id: 7, customer: "Charlie", items: ["Laptop"], total: 4999, date: "2024-03-05" }
];
כתבו ביטויים/פונקציות שמחשבים:
- סך כל ההכנסות (total revenue)
- ההזמנה עם הסכום הגבוה ביותר
- רשימה ייחודית של כל הלקוחות (unique customers)
- רשימה ייחודית של כל המוצרים שנמכרו (unique items - שימו לב שitems הוא מערך!)
- סכום ההוצאות של כל לקוח (אובייקט: { Alice: 7550, Bob: 3850, Charlie: 7799 })
- ההזמנות מחודש פברואר 2024 בלבד, ממוינות מהזולה ליקרה
- הלקוח שביצע הכי הרבה הזמנות
- ממוצע ערך ההזמנה
תרגיל 6 - שטוח ומקובץ - flatMap¶
נתון מערך של כיתות עם תלמידים:
const classes = [
{
name: "Math 101",
students: [
{ name: "Alice", grade: 92 },
{ name: "Bob", grade: 78 },
{ name: "Charlie", grade: 85 }
]
},
{
name: "Science 201",
students: [
{ name: "Alice", grade: 88 },
{ name: "Diana", grade: 95 },
{ name: "Eve", grade: 72 }
]
},
{
name: "History 101",
students: [
{ name: "Bob", grade: 90 },
{ name: "Charlie", grade: 65 },
{ name: "Diana", grade: 82 }
]
}
];
- השתמשו ב-
flatMapכדי לקבל מערך שטוח של כל התלמידים מכל הכיתות (כל אובייקט תלמיד יכלול גם את שם הכיתה) - מצאו את כל התלמידים הייחודיים (שמות בלי כפילויות)
- חשבו את הציון הממוצע של כל תלמיד (בכל הכיתות שהוא לומד בהן)
- מצאו את הכיתה עם הממוצע הגבוה ביותר
תרגיל 7 - reduce מתקדם¶
- כתבו פונקציה
flatten(arr)שמשטחת מערך מקונן לעומק אחד באמצעותreduce(בליflat):
- כתבו פונקציה
pipe(...fns)שמקבלת מספר פונקציות ומחזירה פונקציה חדשה שמפעילה אותן בסדר. השתמשו ב-reduce:
const add10 = (x) => x + 10;
const multiply2 = (x) => x * 2;
const subtract5 = (x) => x - 5;
const transform = pipe(add10, multiply2, subtract5);
console.log(transform(5)); // ((5 + 10) * 2) - 5 = 25
- כתבו פונקציה
groupBy(arr, keyFn)שמקבצת אלמנטים לפי פונקציית מפתח באמצעותreduce(בליObject.groupBy):
const people = [
{ name: "Alice", age: 25 },
{ name: "Bob", age: 30 },
{ name: "Charlie", age: 25 },
{ name: "Diana", age: 30 }
];
groupBy(people, (p) => p.age);
// { 25: [Alice, Charlie], 30: [Bob, Diana] }
תרגיל 8 - אימות קלט - Validation¶
כתבו פונקציה validateForm(fields) שמקבלת מערך של שדות טופס ומחזירה אובייקט עם תוצאות הולידציה.
כל שדה הוא אובייקט:
const fields = [
{ name: "email", value: "test@email.com", rules: ["required", "email"] },
{ name: "password", value: "12", rules: ["required", "minLength:6"] },
{ name: "age", value: "25", rules: ["required", "numeric", "min:18"] },
{ name: "name", value: "", rules: ["required"] }
];
חוקי הולידציה:
- required - הערך לא ריק
- email - מכיל @
- minLength:N - אורך מינימלי N
- numeric - מכיל רק ספרות
- min:N - ערך מספרי מינימלי N
הפונקציה תחזיר:
{
isValid: false,
errors: {
password: ["Must be at least 6 characters"],
name: ["Field is required"]
},
validFields: ["email", "age"]
}
השתמשו ב-reduce, filter, map, every וכדומה.