دوال الـ Set في JavaScript: union و intersection و difference بقت built-in

من ES2025 الـ Set في JavaScript بقى فيه ٧ دوال جاهزة للعمليات على المجموعات بدل filter و includes. إمتى تستخدمها، وإيه اللي لازم تاخد بالك منه، والدعم في المتصفحات و Node.js.

لسه بتكتب a.filter(x => b.includes(x)) عشان تجيب العناصر المشتركة بين قايمتين؟ من ES2025 الـ Set في JavaScript بقى فيه دوال جاهزة لكل العمليات المعروفة على المجموعات، ومش محتاج تكتب utility functions بنفسك.

الدوال السبعة

  • union: بيرجّع كل العناصر اللي في المجموعتين من غير تكرار.
  • intersection: العناصر المشتركة بس.
  • difference: العناصر اللي في الأولى ومش في التانية.
  • symmetricDifference: العناصر اللي في واحدة بس منهم.
  • isSubsetOf: هل كل عناصر المجموعة دي موجودة في التانية؟
  • isSupersetOf: هل المجموعة دي فيها كل عناصر التانية؟
  • isDisjointFrom: هل مفيش ولا عنصر مشترك بينهم؟

أول ٤ بيرجّعوا Set جديد، وآخر ٣ بيرجّعوا true أو false.

مثال عملي

جرّبت الكود ده على Node.js 22:

const a = new Set([1, 2, 3, 4]);
const b = new Set([3, 4, 5]);

a.union(b);               // Set {1, 2, 3, 4, 5}
a.intersection(b);        // Set {3, 4}
a.difference(b);          // Set {1, 2}
a.symmetricDifference(b); // Set {1, 2, 5}

new Set([3, 4]).isSubsetOf(a);    // true
a.isSupersetOf(new Set([1, 2]));  // true
a.isDisjointFrom(new Set([9]));   // true

ليه أحسن من filter و includes؟

لما تكتب a.filter(x => b.includes(x)) على arrays، الـ includes بيلف على كل عناصر b لكل عنصر في a، فالشغل كله O(n·m). دوال الـ Set بتعتمد على has()، والكود بيبقى بيقول هو بيعمل إيه بالظبط: intersection بدل سطر filter محتاج تقراه مرتين.

حاجات لازم تاخد بالك منها

  • الدوال مش بتعدّل الـ Set الأصلي، كلها بترجّع نتيجة جديدة.
  • الـ argument لازم يكون set-like، يعني فيه size و has() و keys(). الـ Set والـ Map ينفعوا، لكن لو بعت array هتاخد TypeError. الحل بسيط: a.union(new Set(arr)).
  • لما تبعت Map، المقارنة بتبقى على الـ keys بتاعته.

الدعم

حسب بيانات التوافق بتاعة MDN:

  • Chrome و Edge 122
  • Firefox 127
  • Safari 17
  • Node.js 22
  • Deno 1.42

MDN بيصنّفها Baseline من يونيو ٢٠٢٤. على Node 20 الدوال دي مش موجودة، فلو الـ backend بتاعك لسه عليه اتأكد قبل ما تستخدمها أو استخدم polyfill زي core-js.

رأيي

دي من الإضافات الصغيرة اللي بتشيل كود كتير: الـ permissions والـ tags والمقارنة بين نسختين من list كلها أماكن طبيعية ليها. لو الـ runtime بتاعك Node 22 أو أحدث، ابدأ بيها النهارده.

المصادر

  • JavaScript
  • Node.js
  • Full Stack Tips
  • ES2025