Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Mã đơn giản nhất để giao hai mảng (array intersection) trong JavaScript

Dùng Set và filter để lấy giao của hai mảng ngắn gọn, hiệu năng tốt (O(n+m)).

Ví dụ minh họa

<html>
<body>
  <script>
    let intersection = function(x, y) {
      x = new Set(x), y = new Set(y);
      return [...x].filter(k => y.has(k));
    };
    document.write(intersection([5,7,4,8], [3,9,8,4,3])); // Kết quả: 8,4
  </script>
</body>
</html>

Giải thích

  1. Chuyển mảng thành Set → loại trùng lặp, tra cứu O(1).
  2. Duyệt set x ([...x]), giữ phần tử có trong set y (y.has(k)).
  3. Kết quả là mảng các phần tử chung, không trùng, theo thứ tự xuất hiện đầu tiên trong x.

Các biến thể

// Giữ trùng lặp (nếu cần)
function intersectionWithDuplicates(a, b) {
  const setB = new Set(b);
  return a.filter(x => setB.has(x));
}

// ES2023+ (proposal) - có thể dùng Array.prototype.intersection() tương lai
// const result = array1.intersection(array2);

Hiệu năng

  • Thời gian: O(n + m)
  • Không gian: O(n + m) cho hai Set
  • Tốt hơn lồng vòng lặp O(n*m) hoặc indexOf O(n*m).