If I understand everything correctly, then this can be done easier. The code can be formatted in different ways. But the main thing is that there is less action. So: - we split the data into parts - then through reduce we form a common array of objects - parse data for object (including `objectid`) - check `globalLkupRemoveContactReviewer` if we should add something - to save space, we form a `child` object once - if we have an object with this `objectid` - update it otherwise create it <!-- begin snippet: js hide: false console: true babel: false --> <!-- language: lang-js --> const globalLkupRemoveContactReviewer = [ { objectid: 555, userid: '1', associationid: '1948874' }, { objectid: 555, userid: '2', associationid: '1950833' }, ]; const myStr = '111*1*1968397,222*1*1968398,222*2*1968399,333*2*1968401,333*4*1968402,333*1*19684034'; const data = myStr.split(',') .reduce((acc, e) => { const [objectid, contactid, associationid] = e.split('*') if (!globalLkupRemoveContactReviewer.find((item2) => item2.userid === contactid)) return acc // skip const parent = acc.find(e => e.objectid === objectid) const child = { isdelete: "1", contactid, associationid } if (parent) { parent.contacts.push(child) // append contact } else { acc.push({objectid,contacts: [child]}) // new object } return acc }, []) console.log(JSON.stringify(data, null, 2)) <!-- end snippet --> As a result, we do not have unnecessary actions and operations.