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

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

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

JS | סינון אובייקט עם כפילות נתונים

מתוזמן נעוץ נעול הועבר תכנות
7 פוסטים 2 כותבים 217 צפיות 2 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • WWWW
    WWWW
    WWW
    כתב ב נערך לאחרונה על ידי WWW
    #1

    יש לי אוביקט JS, כזה:

    const inputArray = [ 
        { id: "1", Step: "Step 1", Task: "Task 1", Value: "5" },
        { id: "1", Step: "Step 1", Task: "Task 2", Value: "10" },
        { id: "1", Step: "Step 2", Task: "Task 1", Value: "15" },
        { id: "2", Step: "Step 2", Task: "Task 2", Value: "20" },
        { id: "3", Step: "Step 1", Task: "Task 1", Value: "25" },
        { id: "3", Step: "Step 1", Task: "Task 2", Value: "30" },
        { id: "3", Step: "Step 2", Task: "Task 1", Value: "35" },
        { id: "4", Step: "Step 2", Task: "Task 2", Value: "40" }
    ];
    
    

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

    const inputArray = [ 
        { id: "1", Step: "Step 1", Task: "Task 1", Value: "5, 10, 15" }
    ];
    
    

    מה הדרך לעשות את זה?
    לעבור עם לולאה על כל המערך, ולשמור במשתנה את הערכים וכו', או שיש דרך קלה יותר.

    אשמח מאד לקבל דוגמת קוד 🙂

    תודה רבה!

    dovidD תגובה 1 תגובה אחרונה
    0
    • WWWW WWW

      יש לי אוביקט JS, כזה:

      const inputArray = [ 
          { id: "1", Step: "Step 1", Task: "Task 1", Value: "5" },
          { id: "1", Step: "Step 1", Task: "Task 2", Value: "10" },
          { id: "1", Step: "Step 2", Task: "Task 1", Value: "15" },
          { id: "2", Step: "Step 2", Task: "Task 2", Value: "20" },
          { id: "3", Step: "Step 1", Task: "Task 1", Value: "25" },
          { id: "3", Step: "Step 1", Task: "Task 2", Value: "30" },
          { id: "3", Step: "Step 2", Task: "Task 1", Value: "35" },
          { id: "4", Step: "Step 2", Task: "Task 2", Value: "40" }
      ];
      
      

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

      const inputArray = [ 
          { id: "1", Step: "Step 1", Task: "Task 1", Value: "5, 10, 15" }
      ];
      
      

      מה הדרך לעשות את זה?
      לעבור עם לולאה על כל המערך, ולשמור במשתנה את הערכים וכו', או שיש דרך קלה יותר.

      אשמח מאד לקבל דוגמת קוד 🙂

      תודה רבה!

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

      מה שאתה רוצה לעשות זה סוג של group by.
      כל group by משמעותו לרכז שורות במספר פחות של שורות.
      בא נראה קיבוץ קלאסי, מפה https://stackoverflow.com/a/34890276/1271037
      הנה הקוד:

      const inputArray = [
        { id: "1", Step: "Step 1", Task: "Task 1", Value: "5" },
        { id: "1", Step: "Step 1", Task: "Task 2", Value: "10" },
        { id: "1", Step: "Step 2", Task: "Task 1", Value: "15" },
        { id: "2", Step: "Step 2", Task: "Task 2", Value: "20" },
        { id: "3", Step: "Step 1", Task: "Task 1", Value: "25" },
        { id: "3", Step: "Step 1", Task: "Task 2", Value: "30" },
        { id: "3", Step: "Step 2", Task: "Task 1", Value: "35" },
        { id: "4", Step: "Step 2", Task: "Task 2", Value: "40" }
      ];
      
      function groupBy(array, key) {
        return array.reduce(function(rv, curr) {
          (rv[curr[key]] = rv[curr[key]] || []).push(curr);
          return rv;
        }, {});
      };
      
      var gr = groupBy(inputArray, "id");
      console.log(gr)
      

      הפלט נראה ככה:

      {
        "1":[{"id":"1","Step":"Step 1","Task":"Task 1","Value":"5"},
            {"id":"1","Step":"Step 1","Task":"Task 2","Value":"10"},
            {"id":"1","Step":"Step 2","Task":"Task 1","Value":"15"}],
       "2":[{"id":"2","Step":"Step 2","Task":"Task 2","Value":"20"}],
       "3":[{"id":"3","Step":"Step 1","Task":"Task 1","Value":"25"},
            {"id":"3","Step":"Step 1","Task":"Task 2","Value":"30"},
            {"id":"3","Step":"Step 2","Task":"Task 1","Value":"35"}],
        "4":[{"id":"4","Step":"Step 2","Task":"Task 2","Value":"40"}]
      }
      

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

      var gr = groupBy(inputArray, "id");
      
      var proj = Object.keys(gr).map(x => {
        var curr = gr[x];
        return {
          id: curr[0].id,
          Step: curr.map(x => x.Step).join(', '),
          Task: curr.map(x => x.Task).join(', '),
          Value: curr.map(x => x.Value).join(', ')
        }
      });
      

      התוצאה:

      [
        { id: "1", Step: "Step 1, Step 1, Step 2", Task: "Task 1, Task 2, Task 1", Value: "5, 10, 15" },
        { id: "2", Step: "Step 2", Task: "Task 2", Value: "20" },
        { id: "3", Step: "Step 1, Step 1, Step 2", Task: "Task 1, Task 2, Task 1", Value: "25, 30, 35" },
        { id: "4", Step: "Step 2", Task: "Task 2", Value: "40" }
      ]
      
      • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
      • בכל נושא אפשר ליצור קשר dovid@tchumim.com
      WWWW 2 תגובות תגובה אחרונה
      1
      • dovidD dovid

        מה שאתה רוצה לעשות זה סוג של group by.
        כל group by משמעותו לרכז שורות במספר פחות של שורות.
        בא נראה קיבוץ קלאסי, מפה https://stackoverflow.com/a/34890276/1271037
        הנה הקוד:

        const inputArray = [
          { id: "1", Step: "Step 1", Task: "Task 1", Value: "5" },
          { id: "1", Step: "Step 1", Task: "Task 2", Value: "10" },
          { id: "1", Step: "Step 2", Task: "Task 1", Value: "15" },
          { id: "2", Step: "Step 2", Task: "Task 2", Value: "20" },
          { id: "3", Step: "Step 1", Task: "Task 1", Value: "25" },
          { id: "3", Step: "Step 1", Task: "Task 2", Value: "30" },
          { id: "3", Step: "Step 2", Task: "Task 1", Value: "35" },
          { id: "4", Step: "Step 2", Task: "Task 2", Value: "40" }
        ];
        
        function groupBy(array, key) {
          return array.reduce(function(rv, curr) {
            (rv[curr[key]] = rv[curr[key]] || []).push(curr);
            return rv;
          }, {});
        };
        
        var gr = groupBy(inputArray, "id");
        console.log(gr)
        

        הפלט נראה ככה:

        {
          "1":[{"id":"1","Step":"Step 1","Task":"Task 1","Value":"5"},
              {"id":"1","Step":"Step 1","Task":"Task 2","Value":"10"},
              {"id":"1","Step":"Step 2","Task":"Task 1","Value":"15"}],
         "2":[{"id":"2","Step":"Step 2","Task":"Task 2","Value":"20"}],
         "3":[{"id":"3","Step":"Step 1","Task":"Task 1","Value":"25"},
              {"id":"3","Step":"Step 1","Task":"Task 2","Value":"30"},
              {"id":"3","Step":"Step 2","Task":"Task 1","Value":"35"}],
          "4":[{"id":"4","Step":"Step 2","Task":"Task 2","Value":"40"}]
        }
        

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

        var gr = groupBy(inputArray, "id");
        
        var proj = Object.keys(gr).map(x => {
          var curr = gr[x];
          return {
            id: curr[0].id,
            Step: curr.map(x => x.Step).join(', '),
            Task: curr.map(x => x.Task).join(', '),
            Value: curr.map(x => x.Value).join(', ')
          }
        });
        

        התוצאה:

        [
          { id: "1", Step: "Step 1, Step 1, Step 2", Task: "Task 1, Task 2, Task 1", Value: "5, 10, 15" },
          { id: "2", Step: "Step 2", Task: "Task 2", Value: "20" },
          { id: "3", Step: "Step 1, Step 1, Step 2", Task: "Task 1, Task 2, Task 1", Value: "25, 30, 35" },
          { id: "4", Step: "Step 2", Task: "Task 2", Value: "40" }
        ]
        
        WWWW
        WWWW
        WWW
        כתב ב נערך לאחרונה על ידי WWW
        #3

        @dovid תודה רבה!
        כבר כתבתי את זה עם for, אבל השיטה שלך נראית טובה יותר, (האמת אולי לא?,כי אני כן צריך את החלק השני, שיהיה מופרד עם פסיקים, וזו פעולה כפולה, מה אתה אומר?)

        מה שאני עשיתי, זה משהו כזה:

                    let oldId;
                    let newArr = [];
        
                    for (var x of ERR) {
                        if (x.Id !== oldId) {
                            newArr[x.Id] = x;
                        } else {
                            newArr[x.Id]['val'] += ', ' + x.val;
                        }
                        oldId = x.Id;
                    }
        
                    ERR = newArr;
        
        

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

        בכל מקרה, מה לדעתך עדיף?

        נ.ב. כמובן שהקוד שלי מתאים רק כשהרשומות מסודרות לפי הסדר של ה ID.

        תגובה 1 תגובה אחרונה
        0
        • dovidD dovid

          מה שאתה רוצה לעשות זה סוג של group by.
          כל group by משמעותו לרכז שורות במספר פחות של שורות.
          בא נראה קיבוץ קלאסי, מפה https://stackoverflow.com/a/34890276/1271037
          הנה הקוד:

          const inputArray = [
            { id: "1", Step: "Step 1", Task: "Task 1", Value: "5" },
            { id: "1", Step: "Step 1", Task: "Task 2", Value: "10" },
            { id: "1", Step: "Step 2", Task: "Task 1", Value: "15" },
            { id: "2", Step: "Step 2", Task: "Task 2", Value: "20" },
            { id: "3", Step: "Step 1", Task: "Task 1", Value: "25" },
            { id: "3", Step: "Step 1", Task: "Task 2", Value: "30" },
            { id: "3", Step: "Step 2", Task: "Task 1", Value: "35" },
            { id: "4", Step: "Step 2", Task: "Task 2", Value: "40" }
          ];
          
          function groupBy(array, key) {
            return array.reduce(function(rv, curr) {
              (rv[curr[key]] = rv[curr[key]] || []).push(curr);
              return rv;
            }, {});
          };
          
          var gr = groupBy(inputArray, "id");
          console.log(gr)
          

          הפלט נראה ככה:

          {
            "1":[{"id":"1","Step":"Step 1","Task":"Task 1","Value":"5"},
                {"id":"1","Step":"Step 1","Task":"Task 2","Value":"10"},
                {"id":"1","Step":"Step 2","Task":"Task 1","Value":"15"}],
           "2":[{"id":"2","Step":"Step 2","Task":"Task 2","Value":"20"}],
           "3":[{"id":"3","Step":"Step 1","Task":"Task 1","Value":"25"},
                {"id":"3","Step":"Step 1","Task":"Task 2","Value":"30"},
                {"id":"3","Step":"Step 2","Task":"Task 1","Value":"35"}],
            "4":[{"id":"4","Step":"Step 2","Task":"Task 2","Value":"40"}]
          }
          

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

          var gr = groupBy(inputArray, "id");
          
          var proj = Object.keys(gr).map(x => {
            var curr = gr[x];
            return {
              id: curr[0].id,
              Step: curr.map(x => x.Step).join(', '),
              Task: curr.map(x => x.Task).join(', '),
              Value: curr.map(x => x.Value).join(', ')
            }
          });
          

          התוצאה:

          [
            { id: "1", Step: "Step 1, Step 1, Step 2", Task: "Task 1, Task 2, Task 1", Value: "5, 10, 15" },
            { id: "2", Step: "Step 2", Task: "Task 2", Value: "20" },
            { id: "3", Step: "Step 1, Step 1, Step 2", Task: "Task 1, Task 2, Task 1", Value: "25, 30, 35" },
            { id: "4", Step: "Step 2", Task: "Task 2", Value: "40" }
          ]
          
          WWWW
          WWWW
          WWW
          כתב ב נערך לאחרונה על ידי WWW
          #4
          פוסט זה נמחק!
          תגובה 1 תגובה אחרונה
          0
          • dovidD
            dovidD
            dovid
            ניהול
            כתב ב נערך לאחרונה על ידי
            #5

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

            אני מתקן את הקוד שלך:

            let lastRow = { Id: -1 };
            let newArr = [];
            
            for (var x of ERR) {
                if (x.Id !== lastRow.Id) {
                    newArr.push(x);
                } else {
                  lastRow.val += ', ' + x.val;
                }
                lastRow = x;
            }
            
            ERR = newArr;
            
            • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
            • בכל נושא אפשר ליצור קשר dovid@tchumim.com
            WWWW תגובה 1 תגובה אחרונה
            1
            • dovidD dovid

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

              אני מתקן את הקוד שלך:

              let lastRow = { Id: -1 };
              let newArr = [];
              
              for (var x of ERR) {
                  if (x.Id !== lastRow.Id) {
                      newArr.push(x);
                  } else {
                    lastRow.val += ', ' + x.val;
                  }
                  lastRow = x;
              }
              
              ERR = newArr;
              
              WWWW
              WWWW
              WWW
              כתב ב נערך לאחרונה על ידי
              #6

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

              dovidD תגובה 1 תגובה אחרונה
              0
              • WWWW WWW

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

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

                @WWW ברור שא"א לסמוך על מקרי. אני חשבתי שזה הפורמט שאתה מקבל כמו למשל ממסד או API.

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

                שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.

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

                בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗

                הרשמה התחברות
                תגובה
                • תגובה כנושא
                התחברו כדי לפרסם תגובה
                • מהישן לחדש
                • מהחדש לישן
                • הכי הרבה הצבעות


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

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

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