मान लीजिए, हमारे पास सरणियों की एक सरणी है जिसमें इस तरह के कुछ लोगों के नाम और ईमेल के बारे में जानकारी है -
const arr = [ ["John", "johnsmith@mail.com", "john00@mail.com"], ["John", "johnnybravo@mail.com"], ["John", "johnsmith@mail.com", "john_newyork@mail.com"], ["Mary", "mary@mail.com"] ];
सरणी का प्रत्येक तत्व स्ट्रिंग्स का एक उप-सरणी है, जहां पहला तत्व एक नाम है, और शेष तत्व उस नाम से संबंधित ईमेल हैं।
अब, हम इन सबएरे को मर्ज करना चाहेंगे। यदि कोई ईमेल है जो दोनों उप-सरणी के लिए समान है, तो दो उप-सरणी निश्चित रूप से एक ही व्यक्ति से संबंधित हैं।
ध्यान दें कि भले ही दो उपसरणियों का एक ही नाम हो, वे अलग-अलग लोगों से संबंधित हो सकते हैं क्योंकि लोगों का एक ही नाम हो सकता है।
एक व्यक्ति के शुरू में कितने भी खाते हो सकते हैं, लेकिन उनके सभी खातों का नाम निश्चित रूप से एक ही होता है।
सबएरे को मर्ज करने के बाद, हमें उन्हें निम्नलिखित प्रारूप में वापस करने की आवश्यकता है - प्रत्येक सबएरे का पहला तत्व नाम है, और शेष तत्व क्रमबद्ध क्रम में ईमेल हैं। उप-सरणी स्वयं को किसी भी क्रम में वापस किया जा सकता है।
इसलिए, उपरोक्त सरणी के लिए, आउटपुट इस तरह दिखना चाहिए -
const output = [ ["John", 'john00@mail.com', 'john_newyork@mail.com', 'johnsmith@mail.com'], ["John", "johnnybravo@mail.com"], ["Mary", "mary@mail.com"] ];
उदाहरण
इसके लिए कोड होगा -
const arr = [ ["John", "johnsmith@mail.com", "john00@mail.com"], ["John", "johnnybravo@mail.com"], ["John", "johnsmith@mail.com", "john_newyork@mail.com"], ["Mary", "mary@mail.com"] ]; 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', 'john00@mail.com', 'john_newyork@mail.com', 'johnsmith@mail.com' ], [ 'John', 'johnnybravo@mail.com' ], [ 'Mary', 'mary@mail.com' ] ]