-2

I am having array of objects with the following structure

const arr = [
              {id: 0, name: "abc", userid: "0"},
              {id: 1, name: "lmn", userid: "123"},
              {id: 3, name: "pqr", userid:"456"},
              {id: 4, name: "xyz", userid: "123"}
            ]

I want to return the objects where userid should be unique and is not equals to "0".

This is my approach. It returns just everything

   const result = [
        ...new Set(
             arr.map((node) => {
            if (node.userid !== "0") return node;
          })
        )
      ];
      console.log(result);
  • You would need to fix your input structure first. You have badly matching quotes. Secondly, use `filter` instead of `map`. – trincot Feb 18 '22 at 11:52
  • Combine [How to remove all duplicates from an array of objects?](https://stackoverflow.com/questions/2218999/how-to-remove-all-duplicates-from-an-array-of-objects) and [Remove array element based on object property](https://stackoverflow.com/questions/15287865/remove-array-element-based-on-object-property) – Ivar Feb 18 '22 at 11:56

2 Answers2

0

Maybe that might me done in a more short-hand way, but it works this way:

const arr = [
          {id: 0, name: "abc", userid: "0"},
          {id: 1, name: "lmn", userid: "123"},
          {id: 3, name: "pqr", userid: "456"},
          {id: 4, name: "xyz", userid: "123"}
        ];

const clearZero = arr.filter((obj) => obj.id != 0);
const finalArray = [];

clearZero.forEach((obj) => {
  if (finalArray.every((elem) => elem.userid !== obj.userid)) {
    finalArray.push(obj);
  }
})

console.log(finalArray); // logs out no. 1 and no.3
  • Basically, **every** method is very handy in checking through all of the elements in the array. With that, we can check if a looped element from clearZero array has the same userid as any of the elements from the finalArray we are creating. – Kacper Łuczak Feb 18 '22 at 12:22
0

Instead of using Set, use Map. Both are used to store unique values, the difference between them is Set for arrays with unique values while Map for objects with unique keys.

const arr = [
  {id: 0, name: "abc", userid: "0"},
  {id: 1, name: "lmn", userid: "123"},
  {id: 3, name: "pqr", userid: "456"},
  {id: 4, name: "xyz", userid: "123"}
];
const result = new Map()
arr.forEach(node => {
  if(node.userid !== "0"){
    result.set(node.userid,node);
  }
})
console.log([...result.values()]); // log intended results

For shorthanded solution you can use:

const result = [...new Map(arr.filter(node=>node.userid!=="0").map(node=>[node.userid, node])).values()];
console.log(result) // log intended results
Ahmed Tarek
  • 318
  • 3
  • 9