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

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

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

עזרה בלולאה על מערך בג'אווה סקריפט

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

    יש לי את הקוד הנחמד הזה, שבעצם אוסף נתונים שמתאימים לערך שמשורשר מ"variableData", ובאם הוא מגיע ל20 ערכים הוא במערך ה"array" הוא מפעיל את הפונקציה "myFunction" ומאפס את המערך וממשיך עד ל20 הבאים.

    הבעיה היא שאני רוצה שהוא יאסוף כל ערך שמשורשר מ"variableData" בנפרד, היינו שאם הערך של "variable" משתנה אז יישלח את הנתונים ל"myFunction" אפילו שיש במערך ה"array" פחות מ20 ערכים, אני לא מצליח לעשות את זה.

    for (var i = 0; i < variableData.length; i++) {
            var variable = variableData[i][0];
            for (var j = 0; j < data.length; j++) {
                if (data[j][1] === variable) {
                    array.push(data[j][0]);
                    if (array.length === 20) {
                        myFunction(array, variable);
                        array = [];
                    }
                }
            }
        }
    
    
    י תגובה 1 תגובה אחרונה
    0
    • י מנותק
      י מנותק
      יוסף בן שמעון
      השיב לhp079 ב נערך לאחרונה על ידי
      #2

      @hp079 ניסחת את השאלה כאחד שנמצא במעמקי הסיטואציה, כדי שגם אחרים יוכלו להבין את השאלה, כדאי שתפרט מה מבנה הנתונים של variableData, מה זה data, מה אתה מנסה לעשות בדיוק, מה אתה מצליח ומה אתה נכשל

      hp079H תגובה 1 תגובה אחרונה
      4
      • hp079H מנותק
        hp079H מנותק
        hp079
        השיב ליוסף בן שמעון ב נערך לאחרונה על ידי hp079
        #3

        @יוסף-בן-שמעון
        יש לי טבלת נתונים עם העמודות מספר זהות, קבוצה, שם וכו'

        variableData זה מערך שמכיל את שמות כל הקבוצות שקיימות.

        data[j][1]
        data מכיל את ההפניה לטבלה, j מסמל את השורה הנוכחית, והמספר את העמודה.

        והקוד הזה בעצם אוסף שורה אחרי שורה את מספרי הזהות של כל קבוצה בנפרד ומכניס אותם למערך array שנשלח לטיפול בפונקציה myFunction.

        את קיבולת המערך array הגבלתי ל20 נתונים בכל שליחה לmyFunction.

        הבעיה, שכשיש פחות מ20 נתונים לקבוצה, אז הלולאה מתחילה מחדש לפני שהיא שולחת את הנתונים לmyFunction ואז נשלח נתונים מעורבבים משני קבוצות. (חוץ מהעובדה שאם יהיו במנה האחרונה פחות מ20 הם לא יישלחו, אבל זה קל לפתור פשוט להוסיף שליחה אחרי סיום הלולאה)

        אני מקווה שכעת זה מובן יותר, תודה.

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

          @hp079 כתב בעזרה בלולאה על מערך בג'אווה סקריפט:

          אני מקווה שכעת זה מובן יותר, תודה.

          אני עדיין לא מבין.
          יש בקוד שני משתנים שלא מוכרזים בו: variableData, data על שניהם אנחנו מצפים לקבל הסבר מה תפקידם ומה הם מכילים.
          הסברת שvariableData מכיל "שמות קבוצות" (??) של טבלה פשוטה. לא הבנתי לגמרי.
          מהקוד נראה שvariableData, data מכילים שניהם (את אותו?) מערך של מערכים (לפי הסבר שלך אח"כ הבנתי שהמערך הוא שורות, והמערך הפנימי הוא שדות/עמודות של כל שורה. עדיין איני יודע מה זה "שמות של קבוצות"),
          על כל איבר בvariableData מתבצעת השוואה בין אלמנט 0 של המערך (עמודה ראשונה), לאלמנט 1 שזה העמודה השניה (של כל מערך מהמערך data). למה? מה זה?

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

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

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

          hp079H תגובה 1 תגובה אחרונה
          1
          • hp079H מנותק
            hp079H מנותק
            hp079
            השיב לdovid ב נערך לאחרונה על ידי
            #5

            @dovid
            יש לי טבלה כמו זה
            ef1d5287-7f47-4d4c-9065-a79d1a2471bb-image.png

            variableData = מכיל את שמות הקבוצות שיכולות להיות בעמודה B [ניסן, אייר]

            data = מכיל את ההפניה לטבלה עצמה, ואני בעצם עושה ככה:
            לוקח את האיבר הראשון מvariableData,
            לוקח את השורה הראשונה מהטבלה, את העמודה B (שבה נמצא הקבוצות) ובודק אם תואם,
            א"כ מכניס את הערך של עמודה A בשורה למערך במשתנה array.
            ואם הערכים לא תואמים, אז מדלג לע"ע על השורה וממשיך הלאה לשורה הבאה עד שמסיים את כל השורות, והלולאה הזו מסתיימת, ואז אני ממשיך לאלה שהם בקבוצה השנייה במערך variableData וכו'.

            זה הפעולות.

            ועשיתי שכשיש במערך array כבר 20 נתונים, אז הוא יישלח לפונקציה הבאה שתטפל בו, ורק אז ימשיך הלאה לאסוף את הנתונים.

            את כל זה כבר עשיתי, הבעיה היא שאני רוצה להוסיף עוד תנאי לשליחה של הarray לפונקציה הבאה, שגם אם זה פחות מ20 נתונים אבל האיבר של הקבוצה שעליו נעשית הבדיקה משתנה אז הנתונים יישלחו.
            (היינו שלא יהיה מצב שבו array מכיל נתונים משני קבוצות)

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

              @hp079 כתב בעזרה בלולאה על מערך בג'אווה סקריפט:

              variableData = מכיל את שמות הקבוצות שיכולות להיות בעמודה B [ניסן, אייר]

              מהתיאור שלך עולה שכל איבר בvariableData הוא ערך טקסט, אבל מהקוד נראה שזה מערך שהחודש נמצא באיבר הראשון שלו.

              נסה את הקוד הזה:

              for (var i = 0; i < variableData.length; i++) {
                  var variable = variableData[i][0];
                  for (var j = 0; j < data.length; j++) {
                      if (data[j][1] === variable) {
                          array.push(data[j][0]);
                          if (array.length === 20) {
                              myFunction(array, variable);
                              array = [];
                          }
                      }
                  }
                  if(array.length){
                      myFunction(array, variable); 
                      array = [];
                  }
              
              }
              

              זה אמור לשלוח את המערכים שקטנים מעשרים.

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

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

              hp079H תגובה 1 תגובה אחרונה
              2
              • hp079H מנותק
                hp079H מנותק
                hp079
                השיב לdovid ב נערך לאחרונה על ידי
                #7

                @dovid זה אכן יעבוד, אבל זה עדיין לא פותר לי את הבעיה העיקרית שלי, איך לשלוח את המערכים של כל איבר בvariableData בנפרד...

                כי כרגע הבדיקה היחידה היא האם המערך הגיע ל20, אני רוצה להוסיף שגם אם האיבר בvariableData שמולו נבדקת ההתאמה מוחלף אז יישלח המערך...

                dovidD תגובה 1 תגובה אחרונה
                0
                • dovidD מנותק
                  dovidD מנותק
                  dovid ניהול
                  השיב לhp079 ב נערך לאחרונה על ידי dovid
                  #8

                  @hp079 למיטב הבנתי אתה טועה.
                  אמנם זו הבדיקה היחידה אבל בשורה 19 המערך נמחק ללא כל תנאי וזה קורה בדיוק לפני שדוגמיםפ ערך חדש מהvariableData.
                  יש הרבה מה לשפר בקוד, ההצהרה על הarray צריכה להיות בתוך הלולאה (בשורה 3), אבל עדיין לדעתי זה אמור לעבוד. הנה טסט:

                  const variableData = [['ניסן'], ['אייר'], ['סיון']];
                  const data = [[123, 'ניסן'], [456, 'אייר'], [567, 'ניסן'], [123, 'אייר'], [456, 'ניסן'], [789, 'סיון'],
                  [123, 'ניסן'], [456, 'אייר'], [567, 'ניסן'], [789, 'אייר'], [123, 'ניסן'], [456, 'סיון']]
                  
                  const myFunction = console.log;
                  
                  for (var i = 0; i < variableData.length; i++) {
                      var variable = variableData[i][0];
                      let array = [];
                      for (var j = 0; j < data.length; j++) {
                          if (data[j][1] === variable) {
                              array.push(data[j][0]);
                              if (array.length === 3) {
                                  myFunction(array, variable);
                                  array = [];
                              }
                          }
                      }
                      if(array.length){
                          myFunction(array, variable); 
                          array = [];
                      }
                   }
                  

                  והפלט:

                  [123, 567, 456] 'ניסן'
                  [123, 567, 123] 'ניסן'
                  [456, 123, 456] 'אייר'
                  [789] 'אייר'
                  [789, 456] 'סיון'
                  

                  שיניתי ל3 בשביל לחסוך לדוגמה.

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

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

                  hp079H תגובה 1 תגובה אחרונה
                  2
                  • hp079H מנותק
                    hp079H מנותק
                    hp079
                    השיב לdovid ב נערך לאחרונה על ידי
                    #9

                    @dovid אתה אכן צודק, וזה עובד מעולה!!

                    תודה!!

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

                      @hp079 תודה על הפידבק.
                      הכנתי לך קוד שלדעתי טוב יותר, וקל יותר לתחזוקה (וזה בלי להבין מה הmyFunction עושה ולמה המגבלה הזו של 20, אני מנחש שיש מה לשפר שמה:

                      const variableData = [['ניסן'], ['אייר'], ['סיון']];
                      const data = [[123, 'ניסן'], [456, 'אייר'], [567, 'ניסן'], [123, 'אייר'], [456, 'ניסן'], [789, 'סיון'],
                      [123, 'ניסן'], [456, 'אייר'], [567, 'ניסן'], [789, 'אייר'], [123, 'ניסן'], [456, 'סיון']]
                      
                      const myFunction = console.log;
                      
                      const grouped = groupBy(data, x => x[1]);
                      for (const [key, arr] of Object.entries(grouped))
                          for (const chunk of sliceIntoChunks(arr.map(x => x[0]), 3))
                              myFunction(chunk, key);
                      
                      //מחלק מערך למערכים בני גודל מסויים מקסימלי
                      function sliceIntoChunks(arr, chunkSize) {
                          const res = [];
                          for (let i = 0; i < arr.length; i += chunkSize)
                              res.push(arr.slice(i, i + chunkSize));
                          return res;
                      }
                      
                      //מקבל מערך ומחזיר אובייקט שהמפתחות הם הסוג והערך הוא מערך התואמים
                      function groupBy(data, groupBy) {
                          const grouped = {};
                          for (const row of data) {
                              const key = groupBy(row);
                              const currentArr = grouped[key] || [];
                              currentArr.push(row);
                              grouped[key] = currentArr;
                          }
                          return grouped;
                      }
                      
                      

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

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

                      hp079H תגובה 1 תגובה אחרונה
                      6
                      • hp079H מנותק
                        hp079H מנותק
                        hp079
                        השיב לdovid ב נערך לאחרונה על ידי
                        #11

                        @dovid תודה רבה!

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

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

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

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