דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. התנהגות מוזרה של מתודת ג'אווהסקריפט reduce

התנהגות מוזרה של מתודת ג'אווהסקריפט reduce

מתוזמן נעוץ נעול הועבר תכנות
4 פוסטים 3 כותבים 278 צפיות 3 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • שלום עולם 0ש
    שלום עולם 0ש
    שלום עולם 0
    כתב ב נערך לאחרונה על ידי
    #1

    יש לי מערך כעין זה.

    let myArr = [[1, 33], ["abc", 50],  [12, 90]];
    

    כל אייטם במערך הוא מערך בן שני אייטמים, שהשני ביניהם (אינדקס 1) הוא מספר.

    לשם הוצאת הסכום של כל הרכיבים השניים בתתי-המערכים, רציתי להשתמש במתודת reduce של JS – שתפקידה לעבור על מערך ולהוציא ערך יחיד לפי פונקציית callback; וכה כתבתי:

    myArr.reduce((item, item2) => item1[1] + item2[1]);
    

    זה נראה שימוש נכון במתודה. אבל נעלבתי מאוד לקבל תשובה שגויה: "NaN"!

    למה NaN?!

    לתוספת הילת התעלומה, כשכתבתי לאמר:

    myArr.reduce((item1,item2) => item1 + item2[1]);
    

    התשובה הייתה:

    '1,335090'
    

    כלומר סטרינג של תת-המערך הראשון בשלמותו, עם אייטמי 1 של שני תתי המערכים האחרים. איזו עקביות יש כאן?!

    yossizY תגובה 1 תגובה אחרונה
    0
    • שלום עולם 0ש שלום עולם 0

      יש לי מערך כעין זה.

      let myArr = [[1, 33], ["abc", 50],  [12, 90]];
      

      כל אייטם במערך הוא מערך בן שני אייטמים, שהשני ביניהם (אינדקס 1) הוא מספר.

      לשם הוצאת הסכום של כל הרכיבים השניים בתתי-המערכים, רציתי להשתמש במתודת reduce של JS – שתפקידה לעבור על מערך ולהוציא ערך יחיד לפי פונקציית callback; וכה כתבתי:

      myArr.reduce((item, item2) => item1[1] + item2[1]);
      

      זה נראה שימוש נכון במתודה. אבל נעלבתי מאוד לקבל תשובה שגויה: "NaN"!

      למה NaN?!

      לתוספת הילת התעלומה, כשכתבתי לאמר:

      myArr.reduce((item1,item2) => item1 + item2[1]);
      

      התשובה הייתה:

      '1,335090'
      

      כלומר סטרינג של תת-המערך הראשון בשלמותו, עם אייטמי 1 של שני תתי המערכים האחרים. איזו עקביות יש כאן?!

      yossizY
      yossizY
      yossiz
      כתב ב נערך לאחרונה על ידי
      #2

      @שלום-עולם-0 אתה צריך לעקוב אחרי התוכן של ה-accumulator‏ (=item1)

      במקרה הראשון: באיטרציה הראשונה הוא מערך שערכו: [1, 33], אבל באיטרציה השניה זה המספר: 83 כי זה מה שהחזרת מהאיטרציה הראשונה, עכשיו הערך של item1[1] זה undefined וחיבור שלו עם 90 מניב NaN
      במקרה השני: באיטרציה הראשונה item1 הוא מערך, התוצאה של חיבור מערך עם מספר הוא המרת המערך למחרוזת (welcome to JS...), וההמשך מובן...

      הפתרון הוא להוסיף ערך ראשוני של 0 עבור item1

      myArr.reduce((item1,item2) => item1 + item2[1], 0); 
      

      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה
      👈 רוצים כתובת מייל בעברית? כנסו למייל.קום 👉

      תגובה 1 תגובה אחרונה
      10
      • צדיק תמיםצ
        צדיק תמיםצ
        צדיק תמים
        כתב ב נערך לאחרונה על ידי
        #3

        רקע לתשובת @yossiz:

        1. הפונקציה של reduce לא מקבלת ארגומנט של item1 ו-item2 דהיינו האיבר הנוכחי במערך והאיבר הקודם, אלא accumulator (כלומר ההצטברות עד עכשיו, ראה בהמשך), וcurrentItem כלומר האיבר הנוכחי.
        2. אם לא מעבירים ערך ראשוני (initialValue), הערך ההתחלתי (כלומר הaccumulator - ההצטברות, באיטרציה הראשונה) יהיה הערך הראשון של המערך.

        אתה יכול לראות כאן מבנה של פונקציית reduce תקינה: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#try_it

        Don’t comment bad code — rewrite it." — Brian W. Kernighan and P. J. Plaugher"
        טיפים

        שלום עולם 0ש תגובה 1 תגובה אחרונה
        8
        • צדיק תמיםצ צדיק תמים

          רקע לתשובת @yossiz:

          1. הפונקציה של reduce לא מקבלת ארגומנט של item1 ו-item2 דהיינו האיבר הנוכחי במערך והאיבר הקודם, אלא accumulator (כלומר ההצטברות עד עכשיו, ראה בהמשך), וcurrentItem כלומר האיבר הנוכחי.
          2. אם לא מעבירים ערך ראשוני (initialValue), הערך ההתחלתי (כלומר הaccumulator - ההצטברות, באיטרציה הראשונה) יהיה הערך הראשון של המערך.

          אתה יכול לראות כאן מבנה של פונקציית reduce תקינה: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#try_it

          שלום עולם 0ש
          שלום עולם 0ש
          שלום עולם 0
          כתב ב נערך לאחרונה על ידי
          #4

          @צדיק-תמים כתב בהתנהגות מוזרה של מתודת ג'אווהסקריפט reduce:

          אתה יכול לראות כאן מבנה של פונקציית reduce תקינה: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#try_it

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

          תגובה 1 תגובה אחרונה
          0

          שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.

          נמאס לכם לגלול בין אותם הפוסטים בכל ביקור? כשנרשמים לחשבון, תמיד תחזרו בדיוק למקום שבו הייתם קודם, ותוכלו לבחור לקבל התראות על תגובות חדשות (בין אם במייל, ובין אם בהתראת פוש). תוכלו גם לשמור סימניות ולפרגן ב-upvote לפוסטים כדי להביע הערכה לחברי קהילה אחרים.

          בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗

          הרשמה התחברות
          תגובה
          • תגובה כנושא
          התחברו כדי לפרסם תגובה
          • מהישן לחדש
          • מהחדש לישן
          • הכי הרבה הצבעות


          בא תתחבר לדף היומי!
          • התחברות

          • אין לך חשבון עדיין? הרשמה

          • התחברו או הירשמו כדי לחפש.
          • פוסט ראשון
            פוסט אחרון
          0
          • דף הבית
          • קטגוריות
          • פוסטים אחרונים
          • משתמשים
          • חיפוש
          • חוקי הפורום