मान लीजिए, हमारे पास सरणियों की एक सरणी है जिसमें कुछ लोगों के नाम और ईमेल के बारे में जानकारी है जैसे -
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' ] ]