1

Hi I m trying to remove duplicates from parent array and nested array of obejcts using id, but if parent id's are null then the object should contain those null id's and remove others which are duplicate, but id's which are null also has duplicate values in nested array which needs to be removed

Here is the array of objects example:

const arr = [{
    id: 6652,
    value: "erger",
    compositField: []
  },
  {

    id: 6652,
    value: "sdfs",
    compositField: []
  },
  {

    id: 6653,
    value: "sdgdfg",
    compositField: []
  },
  {

    id: 6000,
    value: "trgd",
    compositField: []
  },
  {

    id: 6667,
    value: "asdf",
    compositField: []
  },
  {

    id: 6667,
    value: "fdg",
    compositField: []
  },
  {

    id: 6668,
    value: "dfgr",
    compositField: []
  },
  {

    id: null,
    value: "fg",
    compositField: [{
        id: null,
        compositeId: 100,
        value: 'test1'
      },
      {
        id: null,
        compositeId: 100,
        value: 'test2'
      },
    ]
  },
  {

    id: null,
    value: "dfgdf",
    compositField: [{
        id: null,
        compositeId: 100,
        value: 'test3'
      },
      {
        id: null,
        compositeId: 100,
        value: 'test4'
      },
    ]
  },

  {

    id: null,
    value: "fg",
    compositField: [{
        id: null,
        compositeId: 101,
        value: 'test1'
      },
      {
        id: null,
        compositeId: 101,
        value: 'test2'
      },
    ]
  },
  {

    id: null,
    value: "dfgdf",
    compositField: [{
        id: null,
        compositeId: 101,
        value: 'test3'
      },
      {
        id: null,
        compositeId: 101,
        value: 'test4'
      },
    ]
  },
  {

    id: null,
    value: "fg",
    compositField: [{
        id: null,
        compositeId: 103,
        value: 'test1'
      },
      {
        id: null,
        compositeId: 103,
        value: 'test2'
      },
    ]
  },
  {

    id: null,
    value: "dfgdf",
    compositField: [{
        id: null,
        compositeId: 103,
        value: 'test3'
      },
      {
        id: null,
        compositeId: 103,
        value: 'test4'
      },
    ]
  },

];

Below is the final o/p result :

const arr = [{

    id: 6652,
    value: "sdfs",
    compositField: []
  },
  {

    id: 6653,
    value: "sdgdfg",
    compositField: []
  },
  {

    id: 6000,
    value: "trgd",
    compositField: []
  },

  {

    id: 6667,
    value: "fdg",
    compositField: []
  },
  {

    id: 6668,
    value: "dfgr",
    compositField: []
  },
  {

    id: null,
    value: "fg",
    compositField: [{
        id: null,
        compositeId: 100,
        value: 'test1'
      },
      {
        id: null,
        compositeId: 100,
        value: 'test2'
      },
    ]
  },
  {

    id: null,
    value: "dfgdf",
    compositField: [{
        id: null,
        compositeId: 100,
        value: 'test3'
      },
      {
        id: null,
        compositeId: 100,
        value: 'test4'
      },
    ]
  },
];

In the above result the 6652 and 6667 is removed as they were duplicates and but null id are kept as i don't want to remove the null id and remove other repeated values.

But id's which are null are also repeating like compositeId: 101 and compositeId: 103 --> these duplicate need to be removed by comapring the name because name are repeating like 'test1', test2 and so on.. in nested compositField array,

Note: from nested array i want to delete the duplicate with names because the compositField is dynamic values, hence needs to comapare with name.

tried below method :

let index = 0;
const finalResultData = Object.values(
  finalData.reduce(
    (a, c) =>
    c.id === null ?
    { ...a,
      [index++]: c
    } :
    { ...a,
      [c.id]: c
    }, {}
  )
);

3
  • let index = 0; const finalResultData = Object.values( finalData.reduce( (a, c) => c.id === null ? { ...a, [index++]: c } : { ...a, [c.id]: c }, {} ) ); this will remove only the id which are repeating not in nested array Commented Sep 18, 2020 at 8:45
  • do you mean with name value property? Commented Sep 18, 2020 at 8:49
  • @NinaScholz compositeId: 100, value: 'test3' --> name yes Commented Sep 18, 2020 at 8:49

1 Answer 1

1

You could take the values from the nested array as part of the key.

const
    array = [{ id: 6652, value: "erger", compositField: [] }, { id: 6652, value: "sdfs", compositField: [] }, { id: 6653, value: "sdgdfg", compositField: [] }, { id: 6000, value: "trgd", compositField: [] }, { id: 6667, value: "asdf", compositField: [] }, { id: 6667, value: "fdg", compositField: [] }, { id: 6668, value: "dfgr", compositField: [] }, { id: null, value: "fg", compositField: [{ id: null, compositeId: 100, value: 'test1' }, { id: null, compositeId: 100, value: 'test2' }] }, { id: null, value: "dfgdf", compositField: [{ id: null, compositeId: 100, value: 'test3' }, { id: null, compositeId: 100, value: 'test4' }] }, { id: null, value: "fg", compositField: [{ id: null, compositeId: 101, value: 'test1' }, { id: null, compositeId: 101, value: 'test2' }] }, { id: null, value: "dfgdf", compositField: [{ id: null, compositeId: 101, value: 'test3' }, { id: null, compositeId: 101, value: 'test4' }] }, { id: null, value: "fg", compositField: [{ id: null, compositeId: 103, value: 'test1' }, { id: null, compositeId: 103, value: 'test2' }] }, { id: null, value: "dfgdf", compositField: [{ id: null, compositeId: 103, value: 'test3' }, { id: null, compositeId: 103, value: 'test4' }] }],
    result = Object.values(array.reduce((r, o) => {
        if (o.id === null) {
            const key = [o.value, ...o.compositField.map(({ value }) => value)].join('|');
            if (!r[key]) r[key] = o;
        } else {
            r[`|${o.id}`] = o; // prevent numerical key, maintain order
        }
        return r;
    }, {}));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.