Computer >> Máy Tính >  >> Lập trình >> Javascript

Hợp nhất các mảng con trong JavaScript

Giả sử, chúng ta có một mảng mảng chứa thông tin về tên và email của một số người như thế này -

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

Mỗi phần tử của mảng là một mảng con của chuỗi, trong đó phần tử đầu tiên là tên và phần tử còn lại là các email thuộc về tên đó.

Bây giờ, chúng tôi muốn hợp nhất các mảng con này. Hai mảng con chắc chắn thuộc về cùng một người nếu có một số email chung cho cả hai mảng con.

Lưu ý rằng ngay cả khi hai mảng con có cùng tên, chúng có thể thuộc về những người khác nhau vì mọi người có thể có cùng tên.

Ban đầu, một người có thể có bất kỳ số lượng tài khoản nào, nhưng tất cả các tài khoản của họ chắc chắn có cùng một tên.

Sau khi hợp nhất các mảng con, chúng ta cần trả lại chúng ở định dạng sau - phần tử đầu tiên của mỗi mảng con là tên và phần còn lại là các email theo thứ tự được sắp xếp. Bản thân các mảng con có thể được trả lại theo bất kỳ thứ tự nào.

Do đó, đối với mảng trên, đầu ra sẽ giống như -

const output = [
   ["John", 'john00@mail.com', 'john_newyork@mail.com',
   'johnsmith@mail.com'],
   ["John", "johnnybravo@mail.com"],
   ["Mary", "mary@mail.com"]
];

Ví dụ

Mã cho điều này sẽ là -

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));

Đầu ra

Và đầu ra trong bảng điều khiển sẽ là -

[
   [
      'John',
      'john00@mail.com',
      'john_newyork@mail.com',
      'johnsmith@mail.com'
   ],
   [ 'John', 'johnnybravo@mail.com' ],
   [ 'Mary', 'mary@mail.com' ]
]