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

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

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

ריצה בלופ מהאחרון לראשון בJS

מתוזמן נעוץ נעול הועבר תכנות
11 פוסטים 7 כותבים 391 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • צדיק תמיםצ מנותק
    צדיק תמיםצ מנותק
    צדיק תמים
    השיב לשאול נ"י ב נערך לאחרונה על ידי צדיק תמים
    #2

    @שאול-נ-י לא הבנתי, מה המטרה של a?
    אם אתה משתמש בforof אין צורך במשתנה אינדקס

    const str = 'שלום וברכה, נא להשאיר הודעה ונחזור אליכם בהקדם';
    const words = str.match(/.{1,10}(\s|$)/g);
    for (const word of words.reverse()) {
        console.log(word)
    }
    

    ממליץ לקרוא על לולאות בספר של רן בר-זיק (בתשלום, משתלם מאוד לדעתי), זה יעשה לך קצת סדר...

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

    yossizY תגובה 1 תגובה אחרונה
    7
    • yossizY מנותק
      yossizY מנותק
      yossiz
      השיב לשאול נ"י ב נערך לאחרונה על ידי yossiz
      #3

      @שאול-נ-י אמר בריצה בלופ מהאחרון לראשון בJS:

      אז מישהו כתב לי איך לחלק את זה, הנה דוגמא
      str.match(/.{1,10}(\s|$)/g)

      שים לב שבדרך זו יכול להיות מצב שאתה מפספס חלק מהמחרוזת המקורי, למשל אם יש רצף של יותר מ-10 תווים שאינם רווחים, או במקרה של שני סופי שורה זא"ז

      דוגמה:

      const regex = /.{1,10}(\s|$)/g
      
      const works = "שלום וברכה, נא להשאיר הודעה ונחזור אליכם בהקדם";
      const broken1 = "Hmm...\n\nThis is a string with 2 consecutive line breaks";
      const broken2 = "This is a string with more than 10 consecutive non-space characters...";
      
      const resWorks = works.match(regex);
      const resBroken1 = broken1.match(regex);
      const resBroken2 = broken2.match(regex);
      
      console.log(resWorks.join('') === works); // true
      console.log(resBroken1.join('') === broken1); // false
      console.log(resBroken2.join('') === resBroken2); // false
      

      את הבעיה הראשונה אפשר לפתור על ידי הגדלת מספר התווים (זה עדיין קצת מסוכן לענ"ד אלא אם כן התוכן של המחרוזת ידוע מראש), והשנייה על ידי הוספת הדגל s לרג'קס

      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

      ש תגובה 1 תגובה אחרונה
      2
      • I מנותק
        I מנותק
        ivrtikshoret
        השיב לשאול נ"י ב נערך לאחרונה על ידי ivrtikshoret
        #4

        @שאול-נ-י

        מה המטרה?

        תגובה 1 תגובה אחרונה
        0
        • yossizY מנותק
          yossizY מנותק
          yossiz
          השיב לצדיק תמים ב נערך לאחרונה על ידי
          #5

          @צדיק-תמים אמר בריצה בלופ מהאחרון לראשון בJS:

          words.reverse

          שים לב שזה עושה שינוי במערך המקורי

          📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

          צדיק תמיםצ תגובה 1 תגובה אחרונה
          4
          • צדיק תמיםצ מנותק
            צדיק תמיםצ מנותק
            צדיק תמים
            השיב לyossiz ב נערך לאחרונה על ידי צדיק תמים
            #6

            @yossiz צודק.
            הפתרון לזה (במידה שזו לא ההתנהגות הרצויה) הוא ליצור עותק ועליו לרוץ, אפשר אפילו בצורה הזאת:

            const str = 'שלום וברכה, נא להשאיר הודעה ונחזור אליכם בהקדם';
            const words = str.match(/.{1,10}(\s|$)/g);
            for (const word of [...words].reverse()) {
                console.log(word)
            }
            

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

            תגובה 1 תגובה אחרונה
            4
            • dovidD מנותק
              dovidD מנותק
              dovid ניהול
              השיב לשאול נ"י ב נערך לאחרונה על ידי dovid
              #7

              @שאול אני נהנה מהקוד שלך כי הוא מראה על תחכום, ועל ראש מתכנת.
              מה שבעצם חיפשת זה להעלות את המשתנה a באחד בכל סיבוב.
              אולם אתה מצהיר על הa בתוך הלולאה אז הוא לא יכול לזכור מה היה ערכו ב"גלגול" הקודם. צריך להכריז עליו מחוץ לולואה ועם let כי const זה לא בר עדכון.
              העלאה באחד של משתנה זה פעולה פשוטה , a = a + 1, או בדרך הקצרה a++; ככה:

              let a = 0
              for (e of s) {
                a++;
                console.log(s[s.length - a])
              }
              

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

              for (let a = 1; a < (s.length + 1); a++) {
                console.log(s[s.length - a])
              }
              

              בגלל הגמישות של לולאת for אז אפשר ישירות לעשות מניה הפוכה:

              const s = str.match(/.{1,10}(\s|$)/g);
              
              for (let i = s.length -1; i > -1; i--){
                  console.log(s[i])
               }
              

              מה שעשיתי זה קביעת המשתנה i למספר הגבוה, וכל פעם לרדת אחד עד האפס.
              יש בעצם שלוש חלקים, אתחול (let i = s.length -1), תנאי (i > -1), ועדכון מונה (i--).
              האתחול קורה פעם אחת לפני הלולאה בכל מקרה, התנאי נבדק כל פעם לפני האיטרציה (כל "סיבוב") ועדכון המונה מתרחש אחריו.

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

              מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

              בכל נושא אפשר ליצור קשר dovid@tchumim.com

              OdedDvirO Y.Excel.AccessY 2 תגובות תגובה אחרונה
              7
              • dovidD dovid פיצל נושא זה ב
              • OdedDvirO מנותק
                OdedDvirO מנותק
                OdedDvir
                השיב לdovid ב נערך לאחרונה על ידי
                #8
                פוסט זה נמחק!
                תגובה 1 תגובה אחרונה
                0
                • ש מנותק
                  ש מנותק
                  שאול נ"י
                  השיב לyossiz ב נערך לאחרונה על ידי
                  #9

                  @yossiz אמר בריצה בלופ מהאחרון לראשון בJS:

                  @שאול-נ-י אמר בריצה בלופ מהאחרון לראשון בJS:

                  אז מישהו כתב לי איך לחלק את זה, הנה דוגמא
                  str.match(/.{1,10}(\s|$)/g)

                  שים לב שבדרך זו יכול להיות מצב שאתה מפספס חלק מהמחרוזת המקורי, למשל אם יש רצף של יותר מ-10 תווים שאינם רווחים,

                  אכן, ואת זה לקחתי בחשבון, אך למרות זאת זה עדיך לי קודם כל משום שאני מתכוון ליישם את זה על הרבה יותר תווים (אני לא חושב שיש מילה של יותר מ-140 תווים😇 ) וגם במקרה כזה עדיף לי שייחתך באמצע משישאיר יותר תווים

                  או במקרה של שני סופי שורה זא"ז

                  והשנייה על ידי הוספת הדגל s לרג'קס

                  לצערי אני עדיין לא מכיר רג'קס וכמו שציינתי, 'מישהו כתב לי', איך לעשות את זה, ולכן לא הבנתי למה במקרה של שני סופי שורה זה יוצר ת'בעיה (ראיתי בדוגמא שהבאת שזה כך אבל לא למה) וגם מה הפתרון של הוספת s

                  תגובה 1 תגובה אחרונה
                  0
                  • Y.Excel.AccessY מנותק
                    Y.Excel.AccessY מנותק
                    Y.Excel.Access
                    השיב לdovid ב נערך לאחרונה על ידי Y.Excel.Access
                    #10

                    @dovid אמר בריצה בלופ מהאחרון לראשון בJS:

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

                    רציתי לציין עוד מעלה על דרך זו, שבלולאת FOR המשתנה i הרץ על פני הלולאה אינו מאוחסן במשתנה רגיל, אלא הוא מאוחסן במשתנה הקרוב פיזית למעבד. כך שהמהירות אמורה לעלות משמעותית, ובנוסף גם אין צורך לחפש את המשתנה לפי כתובתו כל פעם.
                    כך לפחות במעבדים של פון נוימן.

                    משא"כ אם כותבים let a, ו ++a.

                    Y.Excel.Access @ gmail.com

                    dovidD תגובה 1 תגובה אחרונה
                    0
                    • dovidD מנותק
                      dovidD מנותק
                      dovid ניהול
                      השיב לY.Excel.Access ב נערך לאחרונה על ידי
                      #11

                      @Y-Excel-Access אמר בריצה בלופ מהאחרון לראשון בJS:

                      כך לפחות במעבדים של פון נוימן.

                      זה תלוי קודם כל באיזה מקמפל.
                      באופן כללי, זה נכון שככל שכותבים קוד שמתאים לכוונה זה מיקל על האופטימיזציות של המהדרים/מפרשים.

                      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                      בכל נושא אפשר ליצור קשר dovid@tchumim.com

                      תגובה 1 תגובה אחרונה
                      1
                      • dovidD dovid העביר נושא זה מ-תכנות ב-

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

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

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