मान लीजिए, हमारे पास सरणियों की एक सरणी है जिसमें इस तरह के कुछ लोगों के नाम और ईमेल के बारे में जानकारी है -
const arr = [ ["John", "[email protected]", "[email protected]"], ["John", "[email protected]"], ["John", "[email protected]", "[email protected]"], ["Mary", "[email protected]"] ];
सरणी का प्रत्येक तत्व स्ट्रिंग्स का एक उप-सरणी है, जहां पहला तत्व एक नाम है, और शेष तत्व उस नाम से संबंधित ईमेल हैं।
अब, हम इन सबएरे को मर्ज करना चाहेंगे। यदि कोई ईमेल है जो दोनों उप-सरणी के लिए समान है, तो दो उप-सरणी निश्चित रूप से एक ही व्यक्ति से संबंधित हैं।
ध्यान दें कि भले ही दो उपसरणियों का एक ही नाम हो, वे अलग-अलग लोगों से संबंधित हो सकते हैं क्योंकि लोगों का एक ही नाम हो सकता है।
एक व्यक्ति के शुरू में कितने भी खाते हो सकते हैं, लेकिन उनके सभी खातों का नाम निश्चित रूप से एक ही होता है।
सबएरे को मर्ज करने के बाद, हमें उन्हें निम्नलिखित प्रारूप में वापस करने की आवश्यकता है - प्रत्येक सबएरे का पहला तत्व नाम है, और शेष तत्व क्रमबद्ध क्रम में ईमेल हैं। उप-सरणी स्वयं को किसी भी क्रम में वापस किया जा सकता है।
इसलिए, उपरोक्त सरणी के लिए, आउटपुट इस तरह दिखना चाहिए -
const output = [ ["John", '[email protected]', '[email protected]', '[email protected]'], ["John", "[email protected]"], ["Mary", "[email protected]"] ];
उदाहरण
इसके लिए कोड होगा -
const arr = [ ["John", "[email protected]", "[email protected]"], ["John", "[email protected]"], ["John", "[email protected]", "[email protected]"], ["Mary", "[email protected]"] ]; const recusiveMatch = (included, i, tmp, arr, res) => { for(let j = 1; j < arr[i].length; j += 1) { let currentEmail = arr[i][j]; if(included.has(currentEmail)) continue; res.push(currentEmail); included.add(currentEmail); let currentAccountIndexes = tmp.get(currentEmail); for(let c = 0; c < currentAccountIndexes.length; c += 1) { let currentIndex = currentAccountIndexes[c]; if(i !== currentIndex) { recusiveMatch(included, currentIndex, tmp, arr, res); } } } }; const merge = (arr) => { const tmp = new Map(), included = new Set(), res = []; arr.forEach((account, i) => { for(let u = 1; u < account.length; u += 1) { let currentEMail = account[u]; tmp.set(currentEMail, tmp.get(currentEMail) || []); tmp.get(currentEMail).push(i); } }); arr.forEach((account, i) => { if(!included.has(arr[1])) { let u = []; recusiveMatch(included, i, tmp, arr, u); if(u.length) { res.push(u); u.sort(); u.unshift(account[0]); } } }); return res; }; console.log(merge(arr));
आउटपुट
और कंसोल में आउटपुट होगा -
[ [ 'John', '[email protected]', '[email protected]', '[email protected]' ], [ 'John', '[email protected]' ], [ 'Mary', '[email protected]' ] ]