Zkk
Zkk

Reputation: 751

How to delete duplicate values of objects inside array?

I found several references about how to delete duplicate values in object like this, this, this... In all these examples (and in others that I've found) are for simple objects, but my case is more "complex".

I have an array where each index has your values and an object inside. I create a simple example for explanation:

var data = [
  {
    "name": "Kyle",
    "item": [
      {
        "id": 1,
        "name": "name1"
      },
      {
        "id": 2,
        "name": "name2"
      },
      {
        "id": 3,
        "name": "name3"
      },
      {
        "id": 2,
        "name": "name2"
      }
      {
        "id": 3,
        "name": "name3"
      }
    ]
  },
  {
    "name": "Liza",
    "item": [
      {
        "id": 1,
        "name": "name1"
      },
      {
        "id": 1,
        "name": "name1"
      },
      {
        "id": 2,
        "name": "name2"
      }
    ]
  },
  {
    "name": "John",
    "item": [
      {
        "id": 1,
        "name": "name1"
      },
      {
        "id": 1,
        "name": "name1"
      },
      {
        "id": 4,
        "name": "name4"
      },
      {
        "id": 4,
        "name": "name4"
      },
      {
        "id": 2,
        "name": "name2"
      }
    ]
  },
  {
    "name": "Melissa",
    "item": [
      {
        "id": 2,
        "name": "name2"
      }
    ]
  }
]

How you can see, inside my item objects I've duplicate values... I would like to remove this duplicate values inside my objects.

One way to do this (which I thought) was do it making a copy of my list and using a forEach/map/filter but I don't know how to do it.

I tried this, but not works:

let dataCopy = data;

dataCopy.forEach(dataItem => {
  listPrev.forEach(dataPrev => {

    //??

    //and or...
    if(dataPrev.item.id == dataItem.item.id){          
      //??

    }
  })
})

I'm trying to get this kind of return:

var data = [
  {
    "name": "Kyle",
    "item": [
      {
        "id": 1,
        "name": "name1"
      },
      {
        "id": 2,
        "name": "name2"
      },
      {
        "id": 3,
        "name": "name3"
      },
    ]
  },
  {
    "name": "Liza",
    "item": [
      {
        "id": 1,
        "name": "name1"
      }
      {
        "id": 2,
        "name": "name2"
      }
    ]
  },
  {
    "name": "John",
    "item": [
      {
        "id": 1,
        "name": "name1"
      },
      {
        "id": 4,
        "name": "name4"
      },
      {
        "id": 2,
        "name": "name2"
      }
    ]
  },
  {
    "name": "Melissa",
    "item": [
      {
        "id": 2,
        "name": "name2"
      }
    ]
  }
]

How I can do it? Someone can help me?

Upvotes: 0

Views: 60

Answers (3)

David Cheung
David Cheung

Reputation: 1688

you can write a utility function then map the collection like follow:

var dedupeBy = (arr, by) =>
  Object.values(arr.reduce((a, item) => ({ ...a, [item[by]]: item }), {}));
data.map((person) => ({ ...person, item: dedupeBy(person.item, 'name') }));

Upvotes: 0

tymeJV
tymeJV

Reputation: 104775

Simple forEach and filter will do:

data.forEach(d => {
    d.item = d.item.filter((item, index, self) => {
        return index === self.findIndex(z => z.id == item.id)
    });
});

Upvotes: 1

Ori Drori
Ori Drori

Reputation: 191946

Iterate the array with Array.map(), and apply an array unique function to each item array:

const data = [{"name":"Kyle","item":[{"id":1,"name":"name1"},{"id":2,"name":"name2"},{"id":3,"name":"name3"},{"id":2,"name":"name2"},{"id":3,"name":"name3"}]},{"name":"Liza","item":[{"id":1,"name":"name1"},{"id":1,"name":"name1"},{"id":2,"name":"name2"}]},{"name":"John","item":[{"id":1,"name":"name1"},{"id":1,"name":"name1"},{"id":4,"name":"name4"},{"id":4,"name":"name4"},{"id":2,"name":"name2"}]},{"name":"Melissa","item":[{"id":2,"name":"name2"}]}];

const uniqueById = arr => Object.values(arr.reduce((r, o) => ({
  [o.id]: o,
  ...r
}), {}));

const result = data.map(o => ({
  ...o,
  item: uniqueById(o.item)
}));

console.log(result);

Upvotes: 0

Related Questions