Search code examples
javascripttypescript

How to remove all items with a duplicate from an array of objects?


i have below array of object from API response.i want to push only those object whose id is not repeating and totalTime is 0

for ex - in below JSON, object with id = 4 is repeating twice so i dont want to include this object into new array, here id = 1 and id = 3 have totaltime is 0, than i want to push this one .

Below is my JSON

const response = [
  {  
      "id": "1",
      "oeeCalculations": {
          "others": {
              "totalTime": 0
          }
      }
  },
  {
      "id": "2",
      "oeeCalculations": {
          "others": {
              "totalTime": 744
          }
      }
  },
  {
      "id": "3",
      "oeeCalculations": {
          "others": {
              "totalTime": 0
          }
      }
  },
  {
      "id": "4",
      "oeeCalculations": {
          "others": {
              "totalTime": 0
          }
      }
  },
  {
      "id": "4",
      "oeeCalculations": {
          "others": {
              "totalTime": 744
          }
      }
  }
];

Expected output -

const newResponse = [
    {  
        "id": "1",
        "oeeCalculations": {
            "others": {
                "totalTime": 0
            }
        }
    },
    {
        "id": "3",
        "oeeCalculations": {
            "others": {
                "totalTime": 0
            }
        }
    }
];

I tried below code, but its returning unique lines only..

 const values = Object.values(
      response.reduce((a, b) => {
        if (!a[b.id]) a[b.id] = b 
          return a
       }, {})
    )

Solution

  • Here is another way to achieve the desired result:

    1. Generate an array of all IDs using the map() function
    2. Remove all items which have duplicates IDs using the filter() function, with the help of the previously created ids list
    3. Remove all items which have a totalTime other than 0 using the filter() function
    const ids = response.map(item => item.id);
    const result = response
      .filter(item => ids.filter(id => id === item.id).length === 1)
      .filter(item => item.oeeCalculations.others.totalTime === 0);
    

    Demo:

    const response = [
      {  
          "id": "1",
          "oeeCalculations": {
              "others": {
                  "totalTime": 0
              }
          }
      },
      {
          "id": "2",
          "oeeCalculations": {
              "others": {
                  "totalTime": 744
              }
          }
      },
      {
          "id": "3",
          "oeeCalculations": {
              "others": {
                  "totalTime": 0
              }
          }
      },
      {
          "id": "4",
          "oeeCalculations": {
              "others": {
                  "totalTime": 0
              }
          }
      },
      {
          "id": "4",
          "oeeCalculations": {
              "others": {
                  "totalTime": 744
              }
          }
      }
    ];
    const ids = response.map(item => item.id);
    const result = response
      .filter(item => ids.filter(id => id === item.id).length === 1)
      .filter(item => item.oeeCalculations.others.totalTime === 0);
    console.log(result);