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

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

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

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

מתוזמן נעוץ נעול הועבר תכנות
4 פוסטים 3 כותבים 157 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • שלום עולם 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
    • yossizY מנותק
      yossizY מנותק
      yossiz
      השיב לשלום עולם 0 ב נערך לאחרונה על ידי
      #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
        • שלום עולם 0ש מנותק
          שלום עולם 0ש מנותק
          שלום עולם 0
          השיב לצדיק תמים ב נערך לאחרונה על ידי
          #4

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

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

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

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

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

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

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