استكشاف ثلاث طرق فعّالة للعثور على أطول كلمة في سلسلة نصية باستخدام JavaScript

دقائق القراءة: 5

مقدمة

في عالم تطوير الويب، تعد معالجة النصوص والسلاسل النصية (Strings) من المهام الأساسية والمتكررة. أحد التحديات البرمجية الشائعة هو العثور على أطول كلمة ضمن سلسلة نصية معينة. تتطلب هذه المهمة تحليل كل كلمة على حدة، حساب طولها، ثم مقارنة الأطوال لتحديد الكلمة الأطول وإرجاع طولها. في هذا المقال، سنستعرض ثلاث مقاربات برمجية مختلفة ومميزة لتحقيق ذلك باستخدام JavaScript: الأولى باستخدام حلقة FOR، والثانية بالاستفادة من method sort()، والثالثة باستخدام method reduce().

تحدي الخوارزمية

المهمة: أرجع طول أطول كلمة في الجملة المعطاة. يجب أن تكون النتيجة رقمًا.

حالات الاختبار (Test Cases)

  • findLongestWord("The quick brown fox jumped over the lazy dog") يجب أن تُرجع رقمًا.
  • findLongestWord("The quick brown fox jumped over the lazy dog") يجب أن تُرجع 6.
  • findLongestWord("May the force be with you") يجب أن تُرجع 5.
  • findLongestWord("Google do a barrel roll") يجب أن تُرجع 6.
  • findLongestWord("What is the average airspeed velocity of an unladen swallow") يجب أن تُرجع 8.
  • findLongestWord("What if we try a super-long word such as otorhinolaryngology") يجب أن تُرجع 19.

كمثال للبدء، إليك دالة أساسية لا تحل المشكلة بعد، بل هي نقطة انطلاق:

function findLongestWord ( str ) {
  return str.length; // هذه الدالة لا تحل المشكلة بعد، بل هي نقطة انطلاق.
}
findLongestWord( "The quick brown fox jumped over the lazy dog" );

1. العثور على أطول كلمة باستخدام حلقة FOR

لحل هذه المشكلة باستخدام حلقة FOR، سنستخدم أولاً method String.prototype.split(). تقوم هذه الـ method بتقسيم كائن String إلى مصفوفة من السلاسل النصية عن طريق فصل السلسلة إلى سلاسل فرعية.

إذا أضفنا مسافة فارغة بين قوسين method split()، مثل .split(' ')، فسيتم تقسيم السلسلة عند كل مسافة، مما ينتج عنه مصفوفة من الكلمات المنفصلة:

var strSplit = "The quick brown fox jumped over the lazy dog".split(' ');

سينتج عن ذلك مصفوفة مثل: ["The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"].

أما إذا لم تضف المسافة، أي .split('')، فستحصل على مصفوفة من الأحرف الفردية، بما في ذلك المسافات.

بعد تقسيم السلسلة إلى مصفوفة من الكلمات، نقوم بتهيئة متغير longestWord بقيمة 0. ثم نمر عبر كل كلمة في المصفوفة باستخدام حلقة FOR. في كل تكرار، نقارن طول الكلمة الحالية بطول longestWord. إذا كانت الكلمة الحالية أطول، نقوم بتحديث قيمة longestWord بطول الكلمة الحالية. في النهاية، نُرجع قيمة longestWord.

function findLongestWord ( str ) {
  var strSplit = str.split( ' ' );
  var longestWord = 0 ;
  for ( var i = 0 ; i < strSplit.length; i++){
    if (strSplit[i].length > longestWord){
      longestWord = strSplit[i].length;
    }
  }
  return longestWord;
}
findLongestWord( "The quick brown fox jumped over the lazy dog" );

2. العثور على أطول كلمة باستخدام method sort()

لهذا الحل، سنستخدم method Array.prototype.sort() لفرز المصفوفة بناءً على معيار ترتيب معين، ثم نُرجع طول العنصر الأول في هذه المصفوفة. تقوم method sort() بفرز عناصر المصفوفة في مكانها وتُرجع المصفوفة المفرزة.

إذا قمنا بفرز المصفوفة بشكل افتراضي، مثل:

var sortArray = ["The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"].sort();

فسينتج عن ذلك ترتيب أبجدي (حسب ترميز Unicode)، حيث تأتي الأرقام قبل الأحرف الكبيرة، والتي تأتي قبل الأحرف الصغيرة. هذا سيعطينا مخرجات مثل: ["The", "brown", "dog", "fox", "jumped", "lazy", "over", "quick", "the"]، وهو ليس ما نريده للعثور على أطول كلمة.

لذلك، نحتاج إلى فرز العناصر بناءً على طولها بترتيب تنازلي. نقوم بذلك بتمرير دالة مقارنة مخصصة إلى method sort()، حيث نقارن طول العنصر الثاني بطول العنصر الأول (b.length - a.length). هذا يضمن أن الكلمات الأطول ستأتي في بداية المصفوفة.

function findLongestWord ( str ) {
  var longestWord = str.split( ' ' ).sort( function ( a, b ) {
    return b.length - a.length;
  });
  return longestWord[ 0 ].length;
}
findLongestWord( "The quick brown fox jumped over the lazy dog" );

بعد الفرز، ستكون الكلمة الأطول هي العنصر الأول في المصفوفة longestWord[0]، ثم نُرجع طولها.

3. العثور على أطول كلمة باستخدام method reduce()

في هذا الحل، سنستخدم method Array.prototype.reduce(). تقوم method reduce() بتطبيق دالة على مُجمِّع (accumulator) وكل قيمة في المصفوفة (من اليسار إلى اليمين) لتقليلها إلى قيمة واحدة. تنفذ reduce() دالة رد الاتصال (callback function) مرة واحدة لكل عنصر موجود في المصفوفة.

يمكنك توفير قيمة أولية كوسيط ثانٍ لـ reduce(). في حالتنا، سنضيف سلسلة نصية فارغة "" كقيمة أولية للمُجمِّع (الذي سيمثل أطول كلمة تم العثور عليها حتى الآن).

في دالة رد الاتصال، نقارن طول الكلمة الحالية (currentWord) بطول الكلمة الأطول التي تم تجميعها حتى الآن (longest). إذا كانت الكلمة الحالية أطول، نُرجع الكلمة الحالية لتصبح هي المُجمِّع الجديد. وإلا، نُرجع الكلمة الأطول السابقة. في النهاية، تُرجع reduce() الكلمة الأطول التي تم العثور عليها، ثم نُرجع طولها.

function findLongestWord ( str ) {
  var longestWord = str.split( ' ' ).reduce( function ( longest, currentWord ) {
    return currentWord.length > longest.length ? currentWord : longest;
  }, "" );
  return longestWord.length;
}
findLongestWord( "The quick brown fox jumped over the lazy dog" );

💡 الخلاصة التقنية

لقد استعرضنا ثلاث طرق متميزة للعثور على أطول كلمة في سلسلة نصية باستخدام JavaScript. كل طريقة تقدم منظورًا مختلفًا للتعامل مع المشكلة: حلقة FOR توفر تحكمًا صريحًا ومباشرًا، وهي مثالية للمبتدئين لفهم سير العمل خطوة بخطوة. بينما method sort() تقدم حلاً موجزًا وفعالًا بالاعتماد على قدرات فرز المصفوفات المدمجة، ولكن قد تكون أقل كفاءة في بعض السيناريوهات الكبيرة حيث لا نحتاج لفرز المصفوفة بأكملها. أما method reduce()، فتمثل نهجًا وظيفيًا أنيقًا يسمح بتجميع قيمة واحدة من المصفوفة بكفاءة عالية، مما يجعلها خيارًا ممتازًا للمهام التي تتطلب تجميع البيانات. اختيار الطريقة الأنسب يعتمد على تفضيلات المطور، ومتطلبات الأداء، وقابلية قراءة الكود في سياق المشروع.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *