مقدمة: "هل توجد سلسلتي النصية هنا؟" — السؤال الأبدي للمطور
أنت تكتب كودًا بلغة TypeScript، وفجأة يطرح السؤال: "كيف يمكنني التحقق مما إذا كانت هناك سلسلة نصية معينة في المصفوفة؟" قد يبدو الأمر بسيطًا، لكن تعتمد عليه وظائف المرشحات، والتحقق من صحة النماذج، والبحث في القوائم، ومئات السيناريوهات الأخرى. هذا السؤال على Stack Overflow حصل على آلاف المشاهدات — مما يعني أنه لا يزعج المبتدئين فقط، بل المطورين ذوي الخبرة أيضًا.
اليوم سنستعرض جميع الطرق القانونية للتحقق من وجود سلسلة نصية في مصفوفة TypeScript. لكننا لن نكتفي بسرد الطرق — بل سننظر تحت غطاء الأداء، ونعرف أي خيار أسرع، ومتى يجب استخدام هياكل البيانات المتقدمة. ستتعلم كيف تكتب ليس فقط كودًا يعمل، بل كودًا سريعًا وأنيقًا.
هيا بنا! 🚀
طريقة includes(): البساطة وسهولة القراءة
الطريقة الأكثر وضوحًا وحداثة هي طريقة includes(). ظهرت في ES2016 وهي مدعومة أصلاً في TypeScript. كل ما عليك فعله هو استدعاؤها على المصفوفة وتمرير السلسلة النصية المطلوبة.
const fruits: string[] = ['تفاح', 'موز', 'برتقال', 'كيوي'];const searchTerm: string = 'موز';
if (fruits.includes(searchTerm)) { console.log('تم العثور على الفاكهة! 🍌');} else { console.log('لا توجد هذه الفاكهة.');}المزايا:
- كود قابل للقراءة بدرجة قصوى — واضح فورًا ما نقوم به.
- يعيد قيمة
boolean— مثالي للشروط. - يدعم الكتابة الصارمة في TypeScript.
العيوب:
- بحث خطي O(n) — قد يكون بطيئًا للمصفوفات الضخمة (عشرات الآلاف من العناصر).
- لا يعمل مع
NaN(لكن هذا نادر للسلاسل النصية).
في 90% من المهام، includes() هو اختيارك. بسيط، موثوق، سريع.
طريقة indexOf(): قديمة ولكن موثوقة
قبل ظهور includes()، كان الجميع يستخدمون indexOf(). هذه الطريقة تعيد فهرس العنصر، لكن إذا لم يكن العنصر موجودًا، تعيد -1. التحقق من -1 أصبح كلاسيكيًا.
const languages: string[] = ['JavaScript', 'TypeScript', 'Python', 'Go'];const target: string = 'TypeScript';
if (languages.indexOf(target) !== -1) { console.log('تم العثور على اللغة!');} else { console.log('اللغة غير موجودة في القائمة.');}المزايا:
- تعمل في جميع البيئات، حتى في المتصفحات القديمة (إذا كان ذلك مهمًا).
- يمكن الحصول على موضع العنصر لإجراءات إضافية.
العيوب:
- أقل قابلية للقراءة — يجب تذكر
-1. - نفس التعقيد O(n).
- قد يعترض TypeScript على المقارنة الضمنية؛ من الأفضل تحديد النوع صراحةً.
نصيحة: إذا لم تكن بحاجة إلى الفهرس، استخدم includes(). لكن معرفة indexOf() مفيدة — فهي تظهر في الكود القديم.
طريقة find(): عندما تحتاج إلى أكثر من مجرد true/false
طريقة find() تعيد أول عنصر يحقق الشرط، أو undefined إذا لم يتم العثور على شيء. هذه أداة قوية عندما تبحث ليس فقط عن سلسلة نصية، بل عن كائن بحقل معين.
interface User { id: number; name: string;}
const users: User[] = [ { id: 1, name: 'آنا' }, { id: 2, name: 'بوريس' }, { id: 3, name: 'فيكتور' }];
const foundUser = users.find(user => user.name === 'بوريس');
if (foundUser) { console.log(`تم العثور على المستخدم: ${foundUser.name}`);}بالنسبة للمصفوفات النصية البسيطة، find() مبالغ فيه، لكن إذا كنت بحاجة للحصول على العنصر نفسه أو التحقق من شرط معقد — فهذا هو الخيار الأفضل.
الأداء: أيضًا O(n)، لكنه أبطأ قليلاً من includes() بسبب استدعاء دالة رد الاتصال في كل تكرار.
التحسين باستخدام Set: عندما تكون السرعة حاسمة
إذا كنت تتحقق من وجود