สมมติว่าเรามีอาร์เรย์ของอาร์เรย์ที่มีข้อมูลเกี่ยวกับชื่อและอีเมลของบางคนเช่นนี้ -
const arr = [ ["John", "[email protected]", "[email protected]"], ["John", "[email protected]"], ["John", "[email protected]", "[email protected]"], ["Mary", "[email protected]"] ];
แต่ละองค์ประกอบของอาร์เรย์เป็นอาร์เรย์ย่อยของสตริง โดยที่องค์ประกอบแรกคือชื่อ และองค์ประกอบที่เหลือคืออีเมลที่เป็นของชื่อนั้น
ตอนนี้ เราต้องการรวมอาร์เรย์ย่อยเหล่านี้ อาร์เรย์ย่อย 2 รายการเป็นของบุคคลเดียวกันอย่างแน่นอน หากมีอีเมลบางรายการที่ใช้ร่วมกันในอาร์เรย์ย่อยทั้งสอง
โปรดทราบว่าแม้ว่าอาร์เรย์ย่อย 2 รายการจะมีชื่อเหมือนกัน แต่ก็อาจเป็นคนละกลุ่ม เนื่องจากอาจมีชื่อเหมือนกันได้
บุคคลสามารถมีบัญชีจำนวนเท่าใดก็ได้ในขั้นต้น แต่บัญชีทั้งหมดของพวกเขามีชื่อเหมือนกันอย่างแน่นอน
หลังจากรวมอาร์เรย์ย่อย เราจำเป็นต้องส่งคืนในรูปแบบต่อไปนี้ - องค์ประกอบแรกของแต่ละ subarray คือชื่อ และองค์ประกอบที่เหลือคืออีเมลในลำดับที่จัดเรียง อาร์เรย์ย่อยสามารถส่งคืนได้ในลำดับใดก็ได้
ดังนั้น สำหรับอาร์เรย์ข้างต้น ผลลัพธ์ควรมีลักษณะดังนี้ −
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]' ] ]