دوال الـ 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