תחומים
    • הרשמה
    • התחברות
    • חיפוש
    • קטגוריות
    • פוסטים אחרונים
    • משתמשים
    • חיפוש
    חוקי הפורום

    ביצוע פעולה על מערך ששמו מגיע מהארגומנט (של הפונקציה)

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

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

      let arrayListServerItems = [9, 5, 4];
      let arrayListUserItems = [1, 2, 3];
      function claerArrayListItems(TypeList) {
        `arrayList${TypeList}Items`.length = 0;
      }
      claerArrayListItems("User");
      console.log(arrayListUserItems);
      

      הסיבה שזה לא עבד, די ברורה לי - כי זה מגיע כמחרוזת טקסט... השאלה איך עושים כזה דבר בצורה "נקיה" - בלי לדוגמה switch case שבכל אופציה יריץ ניקוי על המערך הרלוונטי, אלא שזה יקח ישר מתוך הארגומנט את הפונקציה הרצויה לניקוי.

      אם הדיבוג הוא התהליך בו מוציאים באגים מהתוכנה, התכנות חייב להיות התהליך בו מכניסים אותם פנימה (פינת הקפה)

      yossiz תגובה 1 תגובה אחרונה תגובה ציטוט 2
      • yossiz
        yossiz @צדיק תמים נערך לאחרונה על ידי yossiz

        @צדיק-תמים אין דרך נורמלית לעשות דבר כזה ב-JS. (יש דרך לא נורמלית, אבל אל תעשה את זה... eval(`arrayList${TypeList}Items`).length = 0).
        בד"כ, או שמעבירים את האובייקט עצמו שעליו אתה רוצה לבצע את הפעולה. או ששמים את שני הדברים בתוך אובייקט נוסף שממפה { שם (=מפתח) ↔ לערך } ומעבירים את המפתח.

        דוגמאות:

        // דרך 1
        let arrayListServerItems = [9, 5, 4];
        let arrayListUserItems = [1, 2, 3];
        function clearArrayListItems(list) {
          list.length = 0;
        }
        clearArrayListItems(arrayListUserItems);
        console.log(arrayListUserItems);
        
        // דרך 2
        const arrays = {
         arrayListServerItems: [9, 5, 4];
         arrayListUserItems: [1, 2, 3];
        }
        function clearArrayListItems(TypeList) {
          arrays[`arrayList${TypeList}Items`].length = 0;
        }
        clearArrayListItems("User");
        console.log(arrayListUserItems);
        

        נ.ב. מקובל יותר ל"נקות" מערך ככה: arr = []
        ואם כן תצטרך להשתמש בדרך השניה.

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

        צדיק תמים תגובה 1 תגובה אחרונה תגובה ציטוט 5
        • צדיק תמים
          צדיק תמים @yossiz נערך לאחרונה על ידי צדיק תמים

          אכן הדרך של המיפוי כאובייקט נראית לי הכי אלגנטית, אבל לשם הרחבת הידע-
          @yossiz אמר בביצוע פעולה על מערך ששמו מגיע מהארגומנט (של הפונקציה):

          יש דרך לא נורמלית, אבל אל תעשה את זה...
          eval(`arrayList${TypeList}Items`).length = 0

          גם אם הTypeList מגיע מהקוד עצמו ולא מהמשתמש? (כלומר בקוד מוגדר שכפתור X קורא לפונקציה עם ארגומנט "X", וכפתור Z קורא לפונקציה עם ארגומנט "Z", ולא שהמשתמש מזין את שם הרשימה בדרך כלשהיא)

          אם הדיבוג הוא התהליך בו מוציאים באגים מהתוכנה, התכנות חייב להיות התהליך בו מכניסים אותם פנימה (פינת הקפה)

          yossiz 2 תגובות תגובה אחרונה תגובה ציטוט 1
          • yossiz
            yossiz @צדיק תמים נערך לאחרונה על ידי yossiz

            @צדיק-תמים כן, השימוש ב-eval ירים גבות, גם אם במקרה הזה זה אולי לא כל כך נורא. זה תבנית קוד לא מקובלת.

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

            תגובה 1 תגובה אחרונה תגובה ציטוט 3
            • yossiz
              yossiz @צדיק תמים נערך לאחרונה על ידי

              @צדיק-תמים עיין כאן עוד סיבות לא להשתמש ב-eval

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

              צדיק תמים תגובה 1 תגובה אחרונה תגובה ציטוט 1
              • צדיק תמים
                צדיק תמים @yossiz נערך לאחרונה על ידי

                @yossiz המתרגם של הכרום לא אוהב את הדף שהבאת משום מה... הוא לא ממש מתרגם אותו, ואם אני מפעיל את הסימניה שמתקנת את הRTL הוא בכלל מתרגז ומבטל את כל התרגום שכבר היה... 😒

                אם הדיבוג הוא התהליך בו מוציאים באגים מהתוכנה, התכנות חייב להיות התהליך בו מכניסים אותם פנימה (פינת הקפה)

                yossiz תגובה 1 תגובה אחרונה תגובה ציטוט 0
                • yossiz
                  yossiz @צדיק תמים נערך לאחרונה על ידי

                  @צדיק-תמים יש שם הסבר למה השימוש ב-eval גרוע מאוד לביצועים

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

                  dovid תגובה 1 תגובה אחרונה תגובה ציטוט 2
                  • dovid
                    dovid ניהול @yossiz נערך לאחרונה על ידי dovid

                    @yossiz כמו תמיד הנושא הטכנולוגי תפס אותך יותר מאשר הצורך...

                    @צדיק-תמים שים את המערכים באובייקט:

                    arrays = {};
                    arrays.ListServerItems = [9, 5, 4];
                    arrays.ListUserItems = [1, 2, 3];
                    function claerArrayListItems(TypeList) {
                      arrays[`List${TypeList}Items`] = [];
                    }
                    claerArrayListItems("User");
                    console.log(arrayListUserItems);
                    
                    

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

                    צדיק תמים תגובה 1 תגובה אחרונה תגובה ציטוט 0
                    • צדיק תמים
                      צדיק תמים @dovid נערך לאחרונה על ידי צדיק תמים

                      @dovid אני דווקא בעד... 🙂
                      ואסביר: כשאני כותב פה שאלה (כמעט תמיד) זה לא רק בשביל לדעת איך אני עכשיו מעיף את הבעיה הזאת וממשיך כבר לשורה הבאה של הקוד. כמובן אני כותב כאן כי נתקעתי בזה, ואני רוצה להתקדם, אבל לקבל "קביים" חד-פעמיים זה קצת חבל...
                      ולכן תשובה טובה בשבילי זה תשובה שמכילה קודם כל את הפתרון הבסיסי (יותר בקצרה) - כי בכל זאת, לפעמים יש שטח שקשה ללכת וצריך קביים 🙃, אבל גם חלק יותר מעמיק ומפורט - להרחבת הידע בנושא הספציפי... כדי שפעם הבאה שאתקל בבבעיה כזו בוואריאציה מעט שונה, אבין להקביל בין המקרים...
                      לדעתי @yossiz עשה את זה באופן מעולה ומושלם למדיי.

                      אם הדיבוג הוא התהליך בו מוציאים באגים מהתוכנה, התכנות חייב להיות התהליך בו מכניסים אותם פנימה (פינת הקפה)

                      dovid תגובה 1 תגובה אחרונה תגובה ציטוט 4
                      • dovid
                        dovid ניהול @צדיק תמים נערך לאחרונה על ידי dovid

                        @צדיק-תמים בשביל להכריע בינינו אתה צריך להכיר את ההיסטוריה של הבעיטות מתחת לשולחן 🙂
                        אני חושב ש@yossiz יסכים איתי שהוא לא היה אמור בכלל לגלות לך את קיומו של eval בגלל הצורך שהתעורר לך (שבכלל לא נגע ל"הרצת טקסט כקוד"). זה יצא לו כי הוא ישר תפס את הדרך הטכנית שניסת שהדרך היחידה להצליח בכיוון זה הוא eval. אבל הצורך שלך לא נוגע לפתרון הזה בכהוא זה.

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

                        צדיק תמים תגובה 1 תגובה אחרונה תגובה ציטוט 3
                        • צדיק תמים
                          צדיק תמים @dovid נערך לאחרונה על ידי

                          @dovid לא דיברתי על האזכור של eval כן או לא, אלא על התמצות/קצרנות - @yossiz הביא 2 דרכים לפתור את הבעיה שהעיליתי, והזכיר בדרך אגב את eval בדרך השלילה (שעל זה אפשר לדון האם זה נכון או לא, נראה לי שכן כי אני הרי הכרתי את eval, רק עוד לא חשבתי על השימוש בו בהקשר זה...), ואני ניצלתי זאת כדי לוודא באמת את מידת השלילה של השימוש בזה (באופן כללי).
                          לעומת זאת התשובה הזו שלך אמנם השמיטה את הeval, אך על הדרך גם את שאר הפירוט... וקצת חבל
                          ואני הבנתי שעל זה כיוונת (שאין עניין להרחיב בשתי הדרכים האחרות), ועל זה היתה תגובתי...

                          אם הדיבוג הוא התהליך בו מוציאים באגים מהתוכנה, התכנות חייב להיות התהליך בו מכניסים אותם פנימה (פינת הקפה)

                          dovid תגובה 1 תגובה אחרונה תגובה ציטוט 4
                          • dovid
                            dovid ניהול @צדיק תמים נערך לאחרונה על ידי

                            @צדיק-תמים אני מתבייש מאוד, לא קראתי כנראה את הפוסט של יוסי עד הסוף...
                            אתה צודק לגמרי.

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

                            תגובה 1 תגובה אחרונה תגובה ציטוט 8
                            • 1 / 1
                            • פוסט ראשון
                              פוסט אחרון
                            בא תתחבר לדף היומי!