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. Another great example of how to improve performance with reduce. The [morbusg's answer](https://codereview.stackexchange.com/a/283659/255264) has a use of Set, but you can create it in different ways. I suggest creating it in reduce - we will have one cycle. In the case of new Set(x.map(...)) we have a map loop and an inner loop in the Set constructor. <!-- 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' }, ]; console.time('1') for (let i=0; i<100; i++) new Set(globalLkupRemoveContactReviewer.map(({userid}) => userid)) console.timeEnd('1') console.time('2') for (let i=0; i<100; i++) globalLkupRemoveContactReviewer.reduce((acc, {userid}) => acc.has(userid) ? acc : acc.add(userid), new Set) console.timeEnd('2') <!-- end snippet --> The final version might look like this: <!-- 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 globalRemoveContactId = globalLkupRemoveContactReviewer .reduce((acc, {userid}) => acc.has(userid) ? acc : acc.add(userid), new Set) 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 (!globalRemoveContactId.has(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 -->