קודקודייל
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
קודקודייל
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
ראשי ♦ Javascript ♦ Map vs. ForEach

Map vs. ForEach

עידן יצחקי 19 בנובמבר 2021 אין תגובות

בואו נדבר על ההבדל בין map לבין forEach 😎.

במשפט אחד:

map מחזיר מערך לאחר שינוי ולא משנה את המערך שעליו הוא רץ ו-forEach משנה את המערך שעליו הוא רץ

ביותר ממשפט אחד:

function mapping() {
    let arr = [
        {
            name: 'alf',
            id: 1
        },
        {
            name: 'bot',
            id: 2
        },
        {
            name: 'gar',
            id: 3
        },
        {
            name: 'nel',
            id: 4
        },
    ];
    let newArr = arr.map(item => {
        return {
            name: item.name + '-new',
            id: item.id,
            color: 'red'
        }
    });
    console.log(arr);
    console.log(newArr)
}
mapping()

פונקציה פשוטה וקצרה שיש בה:

  1. משתנה שהוא מערך של אובייקטים, לכל אובייקט יש name ו-id.
  2. משתנה נוסף ששווה למשתנה הראשון לאחר שעברנו עליו עם map ושינינו את השם והוספנו color בכל אובייקט.
  3. הדפסה של המשתנה הראשון והשני.

כך ניראת ההדפסה של המערכים:

[
    {
        "name": "alf",
        "id": 1
    },
    {
        "name": "bot",
        "id": 2
    },
    {
        "name": "gar",
        "id": 3
    },
    {
        "name": "nel",
        "id": 4
    }
]
[
    {
        "name": "alf-new",
        "id": 1,
        "color": "red"
    },
    {
        "name": "bot-new",
        "id": 2,
        "color": "red"
    },
    {
        "name": "gar-new",
        "id": 3,
        "color": "red"
    },
    {
        "name": "nel-new",
        "id": 4,
        "color": "red"
    }
]

אפשר לראות שהמערך הראשון לא השתנה והמערך השני שווה למידע של הראשון לאחר השינויים שעשינו

נשנה את map ל- foreach ונראה מה יקרה (שימו לב, זה לא הולך לעבוד)

function mapping() {
    let arr = [
        {
            name: 'alf',
            id: 1
        },
        {
            name: 'bot',
            id: 2
        },
        {
            name: 'gar',
            id: 3
        },
        {
            name: 'nel',
            id: 4
        },
    ];
    let newArr = arr.forEach(item => { // WILL NOT WORK !!!!!
        return {
            name: item.name + '-new',
            id: item.id,
            color: 'red'
        }
    });
    console.log(arr);
    console.log(newArr)
}
mapping()

התוצאה:

[
    {
        "name": "alf",
        "id": 1
    },
    {
        "name": "bot",
        "id": 2
    },
    {
        "name": "gar",
        "id": 3
    },
    {
        "name": "nel",
        "id": 4
    }
]
undefined

מה שקרה הוא, שהראשון לא השתנה והמערך השני לא קיים,

הסיבה היא, forEach רץ על האובייקטים במערך ומנסה לעשות את השינויים על האובייקט עצמו ולכן הוא לא מקבל את ה-return וכמובן שגם לא מחזיר כלום למערך החדש שלנו.

עכשיו נראה איך כן אפשר לשנות את המערך ועדיין נראה שיש בעיה:

function mapping() {
    let arr = [
        {
            name: 'alf',
            id: 1
        },
        {
            name: 'bot',
            id: 2
        },
        {
            name: 'gar',
            id: 3
        },
        {
            name: 'nel',
            id: 4
        },
    ];
    let newArr = arr.forEach(item => { // partial work !!!
        item.name = item.name + '-new';
        item.color = 'red';
    });
    console.log(arr);
    console.log(newArr)
}
mapping()

התוצאה:

[
    {
        "name": "alf-new",
        "id": 1,
        "color": "red"
    },
    {
        "name": "bot-new",
        "id": 2,
        "color": "red"
    },
    {
        "name": "gar-new",
        "id": 3,
        "color": "red"
    },
    {
        "name": "nel-new",
        "id": 4,
        "color": "red"
    }
]
undefined

אפשר לראות שהמערך הראשון שלנו השתנה והמערך השני עדיין לא מוגדר, כמו שאמרתי מקודם, הפונקציה של foreach לא מחזירה כלום ולכן אין טעם לנסות פעולה שכזו.

לסיכום:

אם אתם רוצים להעתיק את המערך עם שינויים בתוכו אבל בלי לפגוע במערך המקורי , אז MAP זה הכיוון.

אם אתם רוצים לשנות את המערך הנוכחי אז FOREACH הוא הכיוון ואז אין טעם להעתיק אותו למשתנה אחר בגלל שזה לא ישנה ויהיה מיותר.

זיכרו!! כשעושים משתנה שווה למשתנה אחר שהוא מערך המחשב לא מבצע העתקה של המערך אלא מיצר את המשתנה ונותן לא REF לאותו תא בזיכרון של המחשב.

זה אומר שאם יהיו לי 2 משתנים שמצביעים לאותו מערך, ברגע שנשנה את המערך באחד מהם, בעצם אנחנו משנים גם את השני.

אף אחד מהם לא באמת מחזיק במערך אלא רק מצביע על מקום בזיכרון שמחזיר את המערך וכל משתנה שיהיה שווה למערך הזה באצם יצביע לאותו מקום בדיוק בזיכרון.

פוסטים קשורים:

תמונת אווירה חצים לשינויהמרה של אקסל למערך וממערך חזרה לאקסל בעזרת JS תמונת אווירה של מקשים במקלדתאיך לכתוב string על כמה שורות ב-javascript מותאם ל-IE11 תמונת אווירה של עוגיות במחשבעוגיות (Cookies) ליצור ולבדוק ב-JS תמונת אווירה של קוביות ואת מוזהבתמדריך javascript למתחיל 101 (שיטת כתיבה)
javascript JS

אודות המחבר

עידן יצחקי להציג את כל הפוסטים של עידן יצחקי


« פוסט קודם
פוסט הבא »

השארת תגובה

ביטול

חיפוש באתר
בחירת העורכים
29 בדצמבר 2023 עידן יצחקי

שדה טקסט עשיר עם תמונות

אתם הולכים להיות מופתעים עד כמה HTML יכול להיות חכם ולבצע משהו כל כך מורכב, שאם אנחנו היינו רוצים ליצור

1 באוקטובר 2021 עידן יצחקי

איך למשוך דינמית favicon של אתרים אחרים ב-JS

בפוסט זה נראה איך אפשר על פי לינקים בדף למשוך את ה-favicon מהדומיין שלהם באופן דינמי, בדיקה של תקינות התמונה

פופולרי
Javascript functions – היכרות עם סוגי פונקציות
Javascript
21 בדצמבר 2024 אין תגובות
Nested routing in angular standalone component
Typescript
15 בנובמבר 2024 תגובה אחת
בחרו לפי תגיות
angular blockchain css ethers express front-end fullstack GQL html javascript next js nextjs nodejs react hooks reactjs solidity webgl אנגולר בלוקציין וורדפרס לימודי אנגולר לימודי וורדפרס לימוד ריאקט מדריך front-end מדריך GQL מדריך אנגולר מדריך וורדפרס מדריך חינם react מדריך ריאקט מפתח בלוק מפתח בלוקציין מתכנת front-end מתכנת בלוקציין מתכנת פרונט סולידיטי קורס front end קורס fullstack קורס nextjs קורס אנגולר קורס בלוקציין קורס בלוקציין בחינם קורס סולידיטי קורס ריאקט קורס תכנות קורס תכנות בחינם
סינון על פי קטגוריות
CSS fullstack HTML IIS Javascript nodeJs SEO Typescript אנגולר בלוקציין בניית אתרים וורדפרס חיפוש עבודה כלים נוספים כללי נגישות קורסים ריאקט תלת מימד תקלות ופתרונות
צור קשר
כל הזכויות שמורות לקודקודייל
ליצירת קשר: @ קודקודייל
גלילה לראש העמוד