עזרה בלולאה על מערך בג'אווה סקריפט
-
יש לי את הקוד הנחמד הזה, שבעצם אוסף נתונים שמתאימים לערך שמשורשר מ"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 = []; } } } }
-
@יוסף-בן-שמעון
יש לי טבלת נתונים עם העמודות מספר זהות, קבוצה, שם וכו'variableData זה מערך שמכיל את שמות כל הקבוצות שקיימות.
data[j][1]
data מכיל את ההפניה לטבלה, j מסמל את השורה הנוכחית, והמספר את העמודה.והקוד הזה בעצם אוסף שורה אחרי שורה את מספרי הזהות של כל קבוצה בנפרד ומכניס אותם למערך array שנשלח לטיפול בפונקציה myFunction.
את קיבולת המערך array הגבלתי ל20 נתונים בכל שליחה לmyFunction.
הבעיה, שכשיש פחות מ20 נתונים לקבוצה, אז הלולאה מתחילה מחדש לפני שהיא שולחת את הנתונים לmyFunction ואז נשלח נתונים מעורבבים משני קבוצות. (חוץ מהעובדה שאם יהיו במנה האחרונה פחות מ20 הם לא יישלחו, אבל זה קל לפתור פשוט להוסיף שליחה אחרי סיום הלולאה)
אני מקווה שכעת זה מובן יותר, תודה.
-
@hp079 כתב בעזרה בלולאה על מערך בג'אווה סקריפט:
אני מקווה שכעת זה מובן יותר, תודה.
אני עדיין לא מבין.
יש בקוד שני משתנים שלא מוכרזים בו: variableData, data על שניהם אנחנו מצפים לקבל הסבר מה תפקידם ומה הם מכילים.
הסברת שvariableData מכיל "שמות קבוצות" (??) של טבלה פשוטה. לא הבנתי לגמרי.
מהקוד נראה שvariableData, data מכילים שניהם (את אותו?) מערך של מערכים (לפי הסבר שלך אח"כ הבנתי שהמערך הוא שורות, והמערך הפנימי הוא שדות/עמודות של כל שורה. עדיין איני יודע מה זה "שמות של קבוצות"),
על כל איבר בvariableData מתבצעת השוואה בין אלמנט 0 של המערך (עמודה ראשונה), לאלמנט 1 שזה העמודה השניה (של כל מערך מהמערך data). למה? מה זה?הניסיון להבין את הבעיה מהקוד ממחיש כמה השאלה לא ברורה.
נראה לי שאתה גם משתמש בקוד כדי שנתייחס באהדה לבעיה שלך, אבל היינו מתייחסים אליה ככה גם בלעדיו. תן דוגמה פשוטה של קלט, ודוגמה לפלט רצוי. -
@dovid
יש לי טבלה כמו זה
variableData = מכיל את שמות הקבוצות שיכולות להיות בעמודה B
[ניסן, אייר]
data = מכיל את ההפניה לטבלה עצמה, ואני בעצם עושה ככה:
לוקח את האיבר הראשון מvariableData,
לוקח את השורה הראשונה מהטבלה, את העמודה B (שבה נמצא הקבוצות) ובודק אם תואם,
א"כ מכניס את הערך של עמודה A בשורה למערך במשתנה array.
ואם הערכים לא תואמים, אז מדלג לע"ע על השורה וממשיך הלאה לשורה הבאה עד שמסיים את כל השורות, והלולאה הזו מסתיימת, ואז אני ממשיך לאלה שהם בקבוצה השנייה במערך variableData וכו'.זה הפעולות.
ועשיתי שכשיש במערך array כבר 20 נתונים, אז הוא יישלח לפונקציה הבאה שתטפל בו, ורק אז ימשיך הלאה לאסוף את הנתונים.
את כל זה כבר עשיתי, הבעיה היא שאני רוצה להוסיף עוד תנאי לשליחה של הarray לפונקציה הבאה, שגם אם זה פחות מ20 נתונים אבל האיבר של הקבוצה שעליו נעשית הבדיקה משתנה אז הנתונים יישלחו.
(היינו שלא יהיה מצב שבו array מכיל נתונים משני קבוצות) -
@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 זה אכן יעבוד, אבל זה עדיין לא פותר לי את הבעיה העיקרית שלי, איך לשלוח את המערכים של כל איבר בvariableData בנפרד...
כי כרגע הבדיקה היחידה היא האם המערך הגיע ל20, אני רוצה להוסיף שגם אם האיבר בvariableData שמולו נבדקת ההתאמה מוחלף אז יישלח המערך...
-
@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 בשביל לחסוך לדוגמה.
-
@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; }