ধরুন, আমাদের কাছে অ্যারের একটি অ্যারে রয়েছে যাতে কিছু লোকের নাম এবং ইমেল সম্পর্কে তথ্য রয়েছে −
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"] ];
অ্যারের প্রতিটি উপাদান হল স্ট্রিংগুলির একটি সাবয়ারে, যেখানে প্রথম উপাদানটি একটি নাম, এবং বাকি উপাদানগুলি সেই নামের ইমেল৷
এখন, আমরা এই subarrays মার্জ করতে চাই. দুটি সাবঅ্যারে অবশ্যই একই ব্যক্তির অন্তর্গত যদি এমন কিছু ইমেল থাকে যা উভয় সাবারেতে সাধারণ৷
মনে রাখবেন যে দুটি সাবয়ারের একই নাম থাকলেও, তারা ভিন্ন লোকের অন্তর্ভুক্ত হতে পারে কারণ মানুষের একই নাম থাকতে পারে।
একজন ব্যক্তির প্রাথমিকভাবে যেকোন সংখ্যক অ্যাকাউন্ট থাকতে পারে, তবে তাদের সমস্ত অ্যাকাউন্টের অবশ্যই একই নাম রয়েছে।
সাবঅ্যারেগুলিকে মার্জ করার পরে, আমাদের সেগুলিকে নিম্নলিখিত বিন্যাসে ফেরত দিতে হবে - প্রতিটি সাবয়ারের প্রথম উপাদান হল নাম, এবং বাকি উপাদানগুলি সাজানো ক্রমে ইমেল। যেকোন ক্রমে সাবয়ারে ফেরত দেওয়া যেতে পারে।
অতএব, উপরের অ্যারের জন্য, আউটপুটটি −
এর মত হওয়া উচিত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' ] ]