شمارش واج‌ها در یک رشته، با استفاده از JavaScript
ﺯﻣﺎﻥ ﻣﻄﺎﻟﻌﻪ: 6 دقیقه

شمارش واج‌ها در یک رشته، با استفاده از JavaScript

در طی سال‌های اخیر، JavaScript با توجه به قابلیت‌های زیادش، همینطور توجه بیشتر و بیشتری به دست آورده است. این زبان، از یک زبان اسکریپت‌نویسی سمت کاربر برای ساخت رابط‌های وب تعاملی شروع کرد، و به استفاده در سمت سرور، برای برنامه‌های موبایل، برنامه‌های کامپیوتر، اینترنت اشیا‌ء و... رسید.

گرچه، واضح است که با وجود محدوده عظیم فریم‌وورک‌های موجود برای ارتقای قدرت یک توسعه‌دهنده JavaScript، همه چیز به درک پایه‌های آن بر می‌گردد. امروزه تعداد بسیار زیادی توسعه‌دهنده JavaScript وجود دارند، که این مسئله باعث می‌شود از خود بپرسیم:«چند نفر واقعا کار خود را بلدند؟»

در این مقاله، الگوریتمی برای شمارش واج‌های یک رشته را پیاده‌سازی می‌کنیم. ما از روش‌های مختلفی برای این کار استفاده خواهیم کرد، که نکات مثبت و منفی هر کدام را نیز بیان می‌کنیم.

چالش

هدف ما، این است که بتوانیم یک رشته با هر طولی را دریافت کنیم، و تعداد واج‌های موجود در آن را پیدا کنیم.

تصور الگوریتم

ما می‌توانیم تابعی بنویسیم، که پارامتری به نام text را داشته باشد. این پارامتر، می‌تواند یک رشته با هر طولی باشد، که در هنگام فراخوانده شدن تابع، به عنوان یک آرگومان به آن ارسال می‌شود.

سپس در داخل این تابع، باید متن موجود را بررسی کنیم و به دنبال بروز حروف صدا دار (a, e, i, o, u) بگردیم.

پس از آن، این تابع باید تعداد واج‌های پیدا شده را برگرداند.

پیاده‌سازی کد

حال از بخش حوصله سر بر ماجرا گذشتیم و به بخش دلنشین کدنویسی رسیدیم. در اینجا، دو راه برای پیاده‌سازی این کار را بررسی خواهیم کرد. در ابتدا از طریق تکرار، و سپس با استفاده از عبارات منظم.

از طریق تکرار

اگر بخواهیم از طریق تکرار این کار را انجام دهیم، باید به صورت حلقه‌وار از هر رشته منتقل شده بگذریم و بررسی کنیم که با هر کدام از حروف صدا دار تطابق دارند، یا نه. قبل از شروع کار، یک شمارنده را نیز راه‌اندازی می‌کنیم و مقدار ۰ را به آن می‌دهیم. در مواردی که یک تطابق یافت شود، یک عدد به آن شمارنده اضافه می‌کنیم.

کد ما به این صورت است:

/*
روش شامل تکرار برای شمردن واج‌های موجود در یک متن
*/
const vowels = ["a", "e", "i", "o", "u"]


function countVowelsIterative(text) {
// راه‌اندازی شمارنده
let counter = 0;


// به صورت حلقه‌وار در متن بگرد و بررسی کن که آیا هر حرف صدا دار است، یا نه.
for (let letter of text.toLowerCase()){
    if (vowels.includes(letter)) {
       counter++
    }
}


// پاسخ قالب‌بندی شده را به کنسول لاگ کن
console.log(`The text contains ${counter} vowel(s)`)


// تعداد واج‌ها را برگردان
return counter
}

/* 
    ============== Test Case ===================
*/
countVowelsIterative('I am a world-class developer using iterations');

خب، حال بیایید برخی نکات کلیدی را بررسی کنیم.

  • در ابتدا، متغیری به نام vowels معرفی کردیم که شامل آرایه‌ای از ۵ حرف صدا دار انگلیسی بود.
  • سپس، از حلقه for استفاده می‌کنیم تا از هر حرف متن مورد نظر، به صورت حلقه‌وار بگذریم.
  • به این که چگونه تمام حروف موجود در متن را به حروف کوچک تبدیل می‌کنیم، دقت کنید. هدف از این کار، این است که حروف صدا دار بزرگ را از دست ندهیم.
  • سپس در داخل همین حلقه، می‌توانیم از یک بیانیه if استفاده کنیم، تا ببینیم که حرف انتخاب شده در آرایه حروف صدا دار که پیش‌تر تعریف کردیم، وجود دارد یا نه. برای این کار، تابع includes() را بر روی حرف مورد نظر فراخوانی می‌کنیم، و مقدار true یا false را بر می‌گردانیم.
  • اگر این شرط مقدار true را برگرداند، شمارنده را افزایش می‌دهیم.
  • پس از پایان حلقه، پیامی را در کنسول چاپ می‌کنیم، که تعداد حروف صدا دار یافت شده را نشان می‌دهد.

حال بیایید یک روش حرفه‌ای‌تر، اما مختصر‌تر را در نظر بگیریم.

با استفاده از عبارات منظم (Regular Expressions)

در تجربه من، عبارات منظم مشکل رایجی برای توسعه‌دهندگان هستند. معمولا سینتکس و نحوه استفاده از آن را درک نمی‌کنیم. از این رو، برخی قطعه کد‌های آنلاین را به کار می‌گیریم، تا بتوانیم از آن‌ها استفاده کنیم.

اساسا، عبارات منظم به ما کمک می‌کنند تا الگوهای ترکیبات کاراکترها را در رشته‌ها پیدا کنیم. بدون توضحیات بیشتر، بیایید به سراغ راه حل خود برویم.کد ما به این صورت است:

/*
    روش عبارات منظم برای شمردن واج‌های موجود در یک متن
*/

function countVowelsRegex(text) {
    // متن را بررسی کن و تمام نمونه‌های مطابق را ذخیره کن
    let matchingInstances = text.match(/[aeiou]/gi);

    // بررسی کن که آیا نمونه‌های مطابق در طول محاسبه شده وجود دارند یا نه.
    if(matchingInstances) {
        // پاسخ قالب‌بندی شده را در کنسول لاگ کن
         console.log(`The text contains ${matchingInstances.length} vowel(s)`) 

         // تعداد واج‌ها را برگردان
        return matchingInstances.length
    } else{
        return 0
    }
}

/* 
    ============== Test Case ===================
*/
countVowelsRegex('I am a world-class developer uisng Regex');

حال بیایید برخی نکات کلیدی این مورد را نیز بررسی کنیم.

  • اولین کاری که در این تابع انجام دادیم، فراخوانی متد thematch() بر روی متنی که آرایه‌ای از تطابقات یافت شده را بر می‌گرداند، بود.
  • عبارات منظم، به دنبال حروف موجود در براکت می‌گردد. برای الگوهای ساده، عبارات منظم در داخل یک جفت اسلش تعریف می‌شوند. به حروف «gi» داخل اسلش‌ها دقت کنید.
  • «g» نمایانگر «Global Search» (جستجوی کلی یا گلوبال) است.
  • «i» نیز نماینگر «Insensitive Search» (جستجوی غیر حساس) است که باعث می‌شود کل عبارت به صورت غیر حساس بررسی شود. (مثلا xyz برابر با XyZ خواهد بود و تفاوتی میان آن‌ها در نظر گرفته نخواهد شد)
  • سپس از یک شرط استفاده می‌کنیم،‌ تا بررسی کنیم که آیا نمونه مطابقی یافت شده است، یا نه. متد match() که در بالا تعریف شده است، اگر مورد مطابقی یافت شود، آرایه‌ای از آیتم‌های مطابق را بر می‌گرداند، و در غیر این صورت مقدار null را بر می‌گرداند.

خلاصه

حال با موفقیت الگوریتمی نوشته‌ایم که تعداد واج‌های موجود در یک رشته در JavaScript را بر می‌گرداند. بیایید هر دو روش مورد استفاده را ارزیابی کنیم. روشی که از طریق تکرار واج‌ها را پیدا کردیم، گرچه به مختصری روش دیگر نیست، روشی ساده‌تر و منطقی‌تر، مخصوصا برای تازه‌کاران است. هر نتیجه‌ای که تصویر زیر نشان دهد، روش Regex بهتر بهینه‌سازی شده است.

پس آیا می‌توان گفت که این روش پیروز شده است؟ به هر حال، هر دو روش کار می‌کنند و می‌توانند استفاده شوند.

منبع

چه امتیازی برای این مقاله میدهید؟

خیلی بد
بد
متوسط
خوب
عالی
2 از 1 رای

/@er79ka

دیدگاه و پرسش

برای ارسال دیدگاه لازم است وارد شده یا ثبت‌نام کنید ورود یا ثبت‌نام

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید