Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

หา Union ของเซตสองเซตใน JavaScript

Union Set คืออะไร

Union ของเซต A และ B คือ เซตที่รวมสมาชิกจาก A, B, หรือทั้งคู่ (ไม่ซ้ำกัน)

ตัวอย่าง

const arr1 = [1, 2, 3];
const arr2 = [100, 2, 1, 10];
// Union = [1, 2, 3, 10, 100]

โค้ดตัวอย่าง (ใช้ Object เป็น Map)

const arr1 = [1, 2, 3];
const arr2 = [100, 2, 1, 10];

const findUnion = (arr1 = [], arr2 = []) => {
  const map = {};
  const res = [];
  
  for (let i = arr1.length - 1; i >= 0; --i) {
    map[arr1[i]] = arr1[i];
  }
  for (let i = arr2.length - 1; i >= 0; --i) {
    map[arr2[i]] = arr2[i];
  }
  for (const n in map) {
    if (map.hasOwnProperty(n)) {
      res.push(map[n]);
    }
  }
  return res;
};

console.log(findUnion(arr1, arr2));

ผลลัพธ์

[ 1, 2, 3, 10, 100 ]

วิธีทันสมัย (ES6+)

1. ใช้ Set (แนะนำมากที่สุด)

const unionSet = (arr1, arr2) => [...new Set([...arr1, ...arr2])];
// หรือ
const unionSet2 = (arr1, arr2) => Array.from(new Set([...arr1, ...arr2]));

2. ใช้ Spread + Set + Filter (เก็บลำดับ)

const unionPreserveOrder = (arr1, arr2) => {
  const seen = new Set();
  return [...arr1, ...arr2].filter(x => {
    if (seen.has(x)) return false;
    seen.add(x);
    return true;
  });
};

3. ใช้ Reduce

const unionReduce = (arr1, arr2) => 
  [...arr1, ...arr2].reduce((acc, val) => 
    acc.includes(val) ? acc : [...acc, val], []);

Union หลายอาร์เรย์

const unionMultiple = (...arrays) => 
  [...new Set(arrays.flat())];

console.log(unionMultiple([1,2], [2,3], [3,4], [4,5])); // [1,2,3,4,5]

Set Operations อื่นๆ

const setA = new Set([1, 2, 3, 4]);
const setB = new Set([3, 4, 5, 6]);

// Intersection ( 교집합 )
const intersection = [...setA].filter(x => setB.has(x)); // [3, 4]

// Difference (차집합 A - B)
const difference = [...setA].filter(x => !setB.has(x)); // [1, 2]

// Symmetric Difference
const symmetricDiff = [...setA].filter(x => !setB.has(x))
  .concat([...setB].filter(x => !setA.has(x))); // [1, 2, 5, 6]

สรุป

  • Set + Spread - สั้นที่สุด เร็วที่สุด O(n) ✓
  • Object Map - รองรับ ES5 แต่ช้ากว่า
  • ควรใช้ Set สำหรับ Unique collections ใน JS สมัยใหม่