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

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

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

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

מתוזמן נעוץ נעול הועבר תכנות
7 פוסטים 2 כותבים 110 צפיות 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
                תגובה
                • תגובה כנושא
                התחברו כדי לפרסם תגובה
                • מהישן לחדש
                • מהחדש לישן
                • הכי הרבה הצבעות


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

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

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