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

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

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

JavaScript Iterator עם כל המתודות השימושיות של מערך

מתוזמן נעוץ נעול הועבר תכנות
8 פוסטים 4 כותבים 259 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • dovidD מנותק
    dovidD מנותק
    dovid ניהול
    כתב ב נערך לאחרונה על ידי
    #1

    למערך יש שפע של מתודות שימושיות: fliter, some, find, reduce ועוד.
    בIterators אין כל אלה (לא הבנתי למה עוד לא עשו).
    הדרך הרגילה היא לעשות [...] או Array.from אבל זה הפסד משמעותי של ביצועים בהתאם לסוג הגנרטור.
    ראיתי בSO קוד כה קצר ופשוט שמפעיל את המתודות גם בIterator:

    var IteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()));
    IteratorPrototype.map = function*(f) {
        for (var x of this)
            yield f(x);
    };
    IteratorPrototype.filter = function*(p) {
        for (var x of this)
            if (p(x))
                yield x;
    };
    IteratorPrototype.scan = function*(f, acc) {
        for (var x of this)
            yield acc = f(acc, x);
        return acc;
    };
    IteratorPrototype.reduce = function(f, acc) {
        for (var x of this)
            acc = f(acc, x);
        return acc;
    };
    
    

    אפשר בקלות להוסיף עוד מתודות שחסרות אחרי שמבינים את הפרנציפ.

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

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

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

      @dovid אני לא מבין איך משתמשים בזה 😞
      ככה??

      for (node of document.querySelectorAll('*')[Symbol.iterator]().filter(node => node.nodeName === 'DIV')) console.log(node)
      

      יש דרך יותר אלגנטי?

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

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

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

        document.querySelectorAll('*')[Symbol.iterator]
        

        מה זה? ואם זה עובד טוב (מבחינת הפעילות מאחורי הקלעים, שלא נעשה מעבר כפול והעתקה) מה לא אלגנטי פה, האריכות?

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

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

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

          @dovid
          אשמח לדוגמאות שימוש.

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

            @dovid אמר בJavaScript Iterator עם כל המתודות השימושיות של מערך:

            האפשרות שאני טועה (חשבתי שNodeList הוא iterable)

            אני מסופק אם אתה מתכוון להכריע שזה כן iterator או לא או שאתה מסופק... בכל מקרה זה כן iterator.

            עכ"פ אתה עצמך הבאת קוד שלא הייתי יודע לכתוב ואני לא מבין אותו:
            document.querySelectorAll('*')[Symbol.iterator]

            מה זה?

            מכיון ש-NodeList הוא iterable לכן יש לו מאפיין [Symbol.iterator] שהיא פונקציה שמחזירה iterator. אני לוקח את ה-iterator וקורא עליו filter שמחזירה iterator מפולטר.

            ואם זה עובד טוב (מבחינת הפעילות מאחורי הקלעים, שלא נעשה מעבר כפול והעתקה) מה לא אלגנטי פה, האריכות?

            זה עובד טוב (לכאורה) כלומר שאין מעבר כפול והעתקה. אבל אפשר לקבל אותו דבר עם קוד קריא:

            for (node of document.querySelectorAll('*')) {
              if (node.nodeName === 'DIV') console.log(node);
            }
            

            מה שחסר יותר זה דרך לקרוא filter ישר על NodeList וזה אתה לא מספק לנו לכאורה.

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

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

              @yossiz אתמול ניסיתי לעשות בזריזות for...of וקיבלתי שגיאה שזה לא iterable והתפלאתי מאוד, ולכן הגעתי למסקנה שזה לא. אני סקרן מה הייתה טעותי, כנראה טעות כתיב.
              כעת הבנתי הכל למפרע. אתה די צודק והקוד זה לא מספיק מיקל, כי הוא נרחיב רק את האיטרטור ולא את האובייקט שמחזיק אותו (האיטיירבל).
              אני כן הייתי מעדיף את הפתרון אותו חשבתי שיש, בהתחשב במספר פעמים רב של שימוש, ובהצטרף מתודות יחד כמו פילטר ושוב פילטר ואז reduce ואז some, קוד מוכן כזה עושה קלות תחזוקה וחיסכון בשגיאות. ולזה אני חושב שהקוד שהבאת הוא חצי פתרון ואני לא רואה בו סרבול רב.

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

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

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

                https://github.com/tc39/proposal-iterator-helpers/issues/8

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

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

                תגובה 1 תגובה אחרונה
                2
                • י מנותק
                  י מנותק
                  יוסף בן שמעון
                  השיב לdovid ב נערך לאחרונה על ידי
                  #8

                  @dovid אמר בJavaScript Iterator עם כל המתודות השימושיות של מערך:

                  למערך יש שפע של מתודות שימושיות: fliter, some, find, reduce ועוד.
                  בIterators אין כל אלה (לא הבנתי למה עוד לא עשו).

                  לא הבנתי כלום 😞
                  למה אתה רוצה את המתודות האלה רק באיטרטורים, למה לא תוסיף לפרוטוטייפ של כל אובייקט באשר הוא איזה מתודות שתרצה.
                  ואם אתה רוצה לאפשר רק באיטרטורים, תוסיף את המתודה לפרוטוטייפ ותבדוק אם היא איטרטור.

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

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

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

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