মান লজিয়ে, আমাদের একটি অ্যারে অফ অ্যারে আছে যেটিতে কিছু মানুষের নাম এবং ইমেইলের তথ্য আছে নিচের মতো −
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' ]
]