Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Javascript

การรวม subarrays ใน JavaScript


สมมติว่าเรามีอาร์เรย์ของอาร์เรย์ที่มีข้อมูลเกี่ยวกับชื่อและอีเมลของบางคนเช่นนี้ -

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"]
];

แต่ละองค์ประกอบของอาร์เรย์เป็นอาร์เรย์ย่อยของสตริง โดยที่องค์ประกอบแรกคือชื่อ และองค์ประกอบที่เหลือคืออีเมลที่เป็นของชื่อนั้น

ตอนนี้ เราต้องการรวมอาร์เรย์ย่อยเหล่านี้ อาร์เรย์ย่อย 2 รายการเป็นของบุคคลเดียวกันอย่างแน่นอน หากมีอีเมลบางรายการที่ใช้ร่วมกันในอาร์เรย์ย่อยทั้งสอง

โปรดทราบว่าแม้ว่าอาร์เรย์ย่อย 2 รายการจะมีชื่อเหมือนกัน แต่ก็อาจเป็นคนละกลุ่ม เนื่องจากอาจมีชื่อเหมือนกันได้

บุคคลสามารถมีบัญชีจำนวนเท่าใดก็ได้ในขั้นต้น แต่บัญชีทั้งหมดของพวกเขามีชื่อเหมือนกันอย่างแน่นอน

หลังจากรวมอาร์เรย์ย่อย เราจำเป็นต้องส่งคืนในรูปแบบต่อไปนี้ - องค์ประกอบแรกของแต่ละ subarray คือชื่อ และองค์ประกอบที่เหลือคืออีเมลในลำดับที่จัดเรียง อาร์เรย์ย่อยสามารถส่งคืนได้ในลำดับใดก็ได้

ดังนั้น สำหรับอาร์เรย์ข้างต้น ผลลัพธ์ควรมีลักษณะดังนี้ −

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' ]
]