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

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

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

אפשר בבקשה קוד של מעבר על עץ *לא* בינארי

מתוזמן נעוץ נעול הועבר תכנות
17 פוסטים 6 כותבים 434 צפיות 3 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • ל ליה

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

    chagoldC מנותק
    chagoldC מנותק
    chagold
    כתב ב נערך לאחרונה על ידי
    #8

    @ליה כתב באפשר בבקשה קוד של מעבר על עץ *לא* בינארי:

    רק שהתסבכתי ואולי בכלל יש דרך לסרוק את המערך לא כמו עץ

    באיזה שפה?

    ל תגובה 1 תגובה אחרונה
    0
    • chagoldC chagold

      @ליה כתב באפשר בבקשה קוד של מעבר על עץ *לא* בינארי:

      רק שהתסבכתי ואולי בכלל יש דרך לסרוק את המערך לא כמו עץ

      באיזה שפה?

      ל מנותק
      ל מנותק
      ליה
      כתב ב נערך לאחרונה על ידי
      #9

      @chagold JS תודה

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

        @ליה מעבר על מאפייני אובייקט נעשה בעזרת Object.keys שנותן את שמות המפתחות, או לולאת for .. in שנותנת גם את שמות המפתחות, או מתודת Object.entries שמחזירה אוסף של זוגות מפתח-ערך, ועוד.
        לשםמעבר עמוק, כלומר שבכל מפתח בודקים את הערך ואם הוא אובייקט יורדים גם לרמה שלו, אפשר להשתמש ברקורסיה. הנה דוגמה:

             function iterateDeep(obj)
             { 
               if (Object(obj) === obj)
                 for (const [k, v] of Object.entries(obj))
                   iterateDeep(v);
               else
                 console.log("item: " + obj);
             }
        

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

          if (Object(obj) === obj) {
            for (const [k, v] of Object.entries(obj))
              if(!v.passLoop){
                 iterateDeep(v, [...keys, k]); 
                 v.passLoop = true;
              }
          } else
             console.log("item: " + obj);
            
        

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

        function iterateDeep(obj, keys = [])
        { 
          if (Object(obj) === obj) {
            for (const [k, v] of Object.entries(obj))
              if(!v.passLoop){
                 iterateDeep(v, [...keys, k]); 
                 v.passLoop = true;
              }
          } else
            console.log(`${keys.join('.')}: ${obj}`);
        }
        
        • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
        • בכל נושא אפשר ליצור קשר dovid@tchumim.com
        dovidD ל 2 תגובות תגובה אחרונה
        8
        • dovidD dovid

          @ליה מעבר על מאפייני אובייקט נעשה בעזרת Object.keys שנותן את שמות המפתחות, או לולאת for .. in שנותנת גם את שמות המפתחות, או מתודת Object.entries שמחזירה אוסף של זוגות מפתח-ערך, ועוד.
          לשםמעבר עמוק, כלומר שבכל מפתח בודקים את הערך ואם הוא אובייקט יורדים גם לרמה שלו, אפשר להשתמש ברקורסיה. הנה דוגמה:

               function iterateDeep(obj)
               { 
                 if (Object(obj) === obj)
                   for (const [k, v] of Object.entries(obj))
                     iterateDeep(v);
                 else
                   console.log("item: " + obj);
               }
          

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

            if (Object(obj) === obj) {
              for (const [k, v] of Object.entries(obj))
                if(!v.passLoop){
                   iterateDeep(v, [...keys, k]); 
                   v.passLoop = true;
                }
            } else
               console.log("item: " + obj);
              
          

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

          function iterateDeep(obj, keys = [])
          { 
            if (Object(obj) === obj) {
              for (const [k, v] of Object.entries(obj))
                if(!v.passLoop){
                   iterateDeep(v, [...keys, k]); 
                   v.passLoop = true;
                }
            } else
              console.log(`${keys.join('.')}: ${obj}`);
          }
          
          dovidD מנותק
          dovidD מנותק
          dovid
          ניהול
          כתב ב נערך לאחרונה על ידי
          #11

          בגירסת גנרטור (הלולאה מתקדמת רק על פי בקשה של for ..of)

          function* iterateDeep(obj, keys = [])
          { 
            if (Object(obj) === obj) {
              for (const [k, v] of Object.entries(obj))
                if(!v.passLoop){
                   yield* iterateDeep(v, [...keys, k]); 
                   v.passLoop = true;
                }
            } else
              yield [keys.join('.'), obj];
          }
          
          • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
          • בכל נושא אפשר ליצור קשר dovid@tchumim.com
          yossizY תגובה 1 תגובה אחרונה
          6
          • dovidD dovid

            בגירסת גנרטור (הלולאה מתקדמת רק על פי בקשה של for ..of)

            function* iterateDeep(obj, keys = [])
            { 
              if (Object(obj) === obj) {
                for (const [k, v] of Object.entries(obj))
                  if(!v.passLoop){
                     yield* iterateDeep(v, [...keys, k]); 
                     v.passLoop = true;
                  }
              } else
                yield [keys.join('.'), obj];
            }
            
            yossizY מנותק
            yossizY מנותק
            yossiz
            כתב ב נערך לאחרונה על ידי
            #12

            @dovid תודה! למדתי כמה דברים שלא הכרתי מהתשובה!

            הערה קטנה:

            if(!v.passLoop){
            ... 
            v.passLoop = true;
            

            שורות אלו נכשלים במקרה ש-v הוא null
            אולי אפשר לתקן כך:

            if(!v?.passLoop){
            ...
            if (v) v.passLoop = true;
            

            או שיש צורה יותר אלגנטית

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

            dovidD תגובה 1 תגובה אחרונה
            5
            • yossizY yossiz

              @dovid תודה! למדתי כמה דברים שלא הכרתי מהתשובה!

              הערה קטנה:

              if(!v.passLoop){
              ... 
              v.passLoop = true;
              

              שורות אלו נכשלים במקרה ש-v הוא null
              אולי אפשר לתקן כך:

              if(!v?.passLoop){
              ...
              if (v) v.passLoop = true;
              

              או שיש צורה יותר אלגנטית

              dovidD מנותק
              dovidD מנותק
              dovid
              ניהול
              כתב ב נערך לאחרונה על ידי dovid
              #13

              @yossiz תודה!

              if(v && !v.passLoop)
              
              • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
              • בכל נושא אפשר ליצור קשר dovid@tchumim.com
              תגובה 1 תגובה אחרונה
              5
              • dovidD dovid

                @ליה מעבר על מאפייני אובייקט נעשה בעזרת Object.keys שנותן את שמות המפתחות, או לולאת for .. in שנותנת גם את שמות המפתחות, או מתודת Object.entries שמחזירה אוסף של זוגות מפתח-ערך, ועוד.
                לשםמעבר עמוק, כלומר שבכל מפתח בודקים את הערך ואם הוא אובייקט יורדים גם לרמה שלו, אפשר להשתמש ברקורסיה. הנה דוגמה:

                     function iterateDeep(obj)
                     { 
                       if (Object(obj) === obj)
                         for (const [k, v] of Object.entries(obj))
                           iterateDeep(v);
                       else
                         console.log("item: " + obj);
                     }
                

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

                  if (Object(obj) === obj) {
                    for (const [k, v] of Object.entries(obj))
                      if(!v.passLoop){
                         iterateDeep(v, [...keys, k]); 
                         v.passLoop = true;
                      }
                  } else
                     console.log("item: " + obj);
                    
                

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

                function iterateDeep(obj, keys = [])
                { 
                  if (Object(obj) === obj) {
                    for (const [k, v] of Object.entries(obj))
                      if(!v.passLoop){
                         iterateDeep(v, [...keys, k]); 
                         v.passLoop = true;
                      }
                  } else
                    console.log(`${keys.join('.')}: ${obj}`);
                }
                
                ל מנותק
                ל מנותק
                ליה
                כתב ב נערך לאחרונה על ידי
                #14

                @dovid היי עדיין לא הסתדרתי ואני מרגישה שאני מתפוצצת. אני לא מבינה מה אני מפספסת

                המערך שלי כולו מכיל אובייקטים, שחלקם מכילים בתוכם גם אובייקטים:

                זה המערך:

                [
                  {
                    "id": "1",
                    "name": "sara",
                    "children": [
                      {
                        "id": "2",
                        "name": "dian"
                      },
                      {
                        "id": "3",
                        "name": "michael",
                        "children": [
                          {
                            "id": "4",
                            "name": "dkny"
                          },
                          {
                            "id": "5",
                            "name": "Anne"
                          }
                        ]
                      }
                
                    ]
                  },
                  {
                    "id": "6",
                    "name": "Tommy"
                  },
                  {
                    "id": "7",
                    "name": "danken",
                    "children": [
                      {
                        "id": "8",
                        "name": "biria"
                      }
                    ]
                  }
                
                ]
                

                תודה על היחס.

                ל תגובה 1 תגובה אחרונה
                0
                • ל ליה

                  @dovid היי עדיין לא הסתדרתי ואני מרגישה שאני מתפוצצת. אני לא מבינה מה אני מפספסת

                  המערך שלי כולו מכיל אובייקטים, שחלקם מכילים בתוכם גם אובייקטים:

                  זה המערך:

                  [
                    {
                      "id": "1",
                      "name": "sara",
                      "children": [
                        {
                          "id": "2",
                          "name": "dian"
                        },
                        {
                          "id": "3",
                          "name": "michael",
                          "children": [
                            {
                              "id": "4",
                              "name": "dkny"
                            },
                            {
                              "id": "5",
                              "name": "Anne"
                            }
                          ]
                        }
                  
                      ]
                    },
                    {
                      "id": "6",
                      "name": "Tommy"
                    },
                    {
                      "id": "7",
                      "name": "danken",
                      "children": [
                        {
                          "id": "8",
                          "name": "biria"
                        }
                      ]
                    }
                  
                  ]
                  

                  תודה על היחס.

                  ל מנותק
                  ל מנותק
                  ליה
                  כתב ב נערך לאחרונה על ידי
                  #15

                  @dovid אני רוצה לעבור עליו ולהדפיס את האבא ובתוכו את הבן ובתוך הבן את הנכד, את התגיות אני עושה בHTML (את זה לפחות אני יודעת חח)
                  תודה רבה

                  chagoldC dovidD 2 תגובות תגובה אחרונה
                  0
                  • ל ליה

                    @dovid אני רוצה לעבור עליו ולהדפיס את האבא ובתוכו את הבן ובתוך הבן את הנכד, את התגיות אני עושה בHTML (את זה לפחות אני יודעת חח)
                    תודה רבה

                    chagoldC מנותק
                    chagoldC מנותק
                    chagold
                    כתב ב נערך לאחרונה על ידי chagold
                    #16

                    @ליה https://jsfiddle.net/g4tsejc9/

                    תגובה 1 תגובה אחרונה
                    0
                    • ל ליה

                      @dovid אני רוצה לעבור עליו ולהדפיס את האבא ובתוכו את הבן ובתוך הבן את הנכד, את התגיות אני עושה בHTML (את זה לפחות אני יודעת חח)
                      תודה רבה

                      dovidD מנותק
                      dovidD מנותק
                      dovid
                      ניהול
                      כתב ב נערך לאחרונה על ידי
                      #17

                      @ליה באיזה פרימוורק את משתמשת? אנגולר?

                      • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                      • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                      תגובה 1 תגובה אחרונה
                      0
                      תגובה
                      • תגובה כנושא
                      התחברו כדי לפרסם תגובה
                      • מהישן לחדש
                      • מהחדש לישן
                      • הכי הרבה הצבעות


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

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

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