לדלג לתוכן

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 }
];

כתבו את הפעולות הבאות (כל אחת בשורה אחת או שתיים באמצעות שרשור מתודות):

  1. קבלו מערך של שמות כל המוצרים שנמצאים במלאי (inStock === true)
  2. קבלו את סכום המחירים של כל המוצרים בקטגוריית electronics
  3. קבלו מערך של מוצרי ביגוד (clothing) ממוינים מהזול ליקר
  4. מצאו את המוצר הכי יקר שנמצא במלאי
  5. בדקו אם כל מוצרי האלקטרוניקה נמצאים במלאי
  6. בדקו אם יש לפחות מוצר אחד שעולה פחות מ-50

תרגיל 2 - סטטיסטיקות ציונים

נתון מערך של ציונים:

const scores = [95, 82, 67, 54, 88, 91, 73, 45, 78, 99, 62, 85, 70, 38, 93];

השתמשו במתודות מערכים (בלי לולאות רגילות) כדי:

  1. לחשב את הממוצע של כל הציונים
  2. למצוא את הציון הגבוה ביותר ואת הנמוך ביותר
  3. לספור כמה ציונים מעל 80
  4. ליצור מערך חדש שבו כל ציון מעוגל למעלה למכפלה של 5 הקרובה (למשל 82 -> 85, 67 -> 70)
  5. לקבל מערך של ציונים עוברים (55 ומעלה) ממוינים מהגבוה לנמוך
  6. לחלק את הציונים לקבוצות: "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  "
];

השתמשו בשרשור מתודות כדי:

  1. לנקות רווחים מיותרים (trim) ולהמיר הכל לאותיות קטנות
  2. לקבל מערך של כל המילים מכל המשפטים (flat array of words)
  3. לספור כמה פעמים כל מילה מופיעה (object שמפתחותיו הן המילים והערכים הם מספר ההופעות)
  4. למצוא את המשפט הכי ארוך (הכי הרבה תווים)
  5. לסנן רק משפטים שמכילים את המילה "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" }
];

כתבו פונקציות שמקבלות את המערך ומחזירות:

  1. getIncompleteTodos(todos) - מערך של כל המשימות שלא הושלמו
  2. getHighPriorityIncomplete(todos) - מערך של משימות בעדיפות גבוהה שלא הושלמו
  3. getCompletionRate(todos) - אחוז ההשלמה (מספר בין 0 ל-100)
  4. getTodosByPriority(todos) - אובייקט שמקבץ את המשימות לפי עדיפות
  5. getFormattedList(todos) - מערך של מחרוזות בפורמט: "[x] Learn JavaScript (high)" או "[ ] Build a project (high)"
  6. 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" }
];

כתבו ביטויים/פונקציות שמחשבים:

  1. סך כל ההכנסות (total revenue)
  2. ההזמנה עם הסכום הגבוה ביותר
  3. רשימה ייחודית של כל הלקוחות (unique customers)
  4. רשימה ייחודית של כל המוצרים שנמכרו (unique items - שימו לב שitems הוא מערך!)
  5. סכום ההוצאות של כל לקוח (אובייקט: { Alice: 7550, Bob: 3850, Charlie: 7799 })
  6. ההזמנות מחודש פברואר 2024 בלבד, ממוינות מהזולה ליקרה
  7. הלקוח שביצע הכי הרבה הזמנות
  8. ממוצע ערך ההזמנה

תרגיל 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 }
    ]
  }
];
  1. השתמשו ב-flatMap כדי לקבל מערך שטוח של כל התלמידים מכל הכיתות (כל אובייקט תלמיד יכלול גם את שם הכיתה)
  2. מצאו את כל התלמידים הייחודיים (שמות בלי כפילויות)
  3. חשבו את הציון הממוצע של כל תלמיד (בכל הכיתות שהוא לומד בהן)
  4. מצאו את הכיתה עם הממוצע הגבוה ביותר

תרגיל 7 - reduce מתקדם

  1. כתבו פונקציה flatten(arr) שמשטחת מערך מקונן לעומק אחד באמצעות reduce (בלי flat):
flatten([[1, 2], [3, 4], [5, 6]]); // [1, 2, 3, 4, 5, 6]
  1. כתבו פונקציה 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
  1. כתבו פונקציה 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 וכדומה.