Բավականին տարածված ու հեշտ խնդիր է, հաճախակի հանդիպում է հարցազրույցների ժամանակ։ Պետք է գրել այնպիսի ֆունկցիա, որը որպես արգումենտ կստանա տեքստ, և կվերադարձնի տվյալ տեքստի մեջ եղած ձայնավորների քանակը։ Անգլերենի այբուբենում ձայնավորներ են հանդիսանում հետևյալ հնչյունները՝ «a», «e», «i», «o», «u»։ Օրինակ՝
findVowels("independent"); // 4
findVowels("fine"); // 2
findVowels("dry"); // 0
Ֆունկցիան կարելի է գրել հետևյալ կերպ՝
function findVowels(str) {
let count = 0;
const vowels = ["a", "e", "i", "o", "u"];
for (let char of str.toLowerCase()) {
if (vowels.includes(char)) {
count++;
}
}
return count;
}
Փորձենք հասկանալ թե ինչպես է այն աշխատում։ Նախ և առաջ ֆունկցիայի մարմնում հայտարարում ենք counter փոփոխականը։ Նրա դերը կայանալու է ձայնավորների քանակը պահելու մեջ։ Այն, կարող ենք ասել, որ հանդիսանում է «հաշվիչ», և որպես սկզբնական արժեք մենք նրան վերագրում ենք 0։ Հաջորդ տողում հայտարարում ենք vowels կոնստանտը (հաստատունը), որին վերագրում ենք զանգված, որն իր մեջ պարունակում է բոլոր ձայնավորները։
Հաջորդը for of ցիկլն է, այն լեզվին ավելացել է ES6 ստանդարտից սկսած, և թույլ է տալիս աշխատել բոլոր iterable օբյեկտների հետ։ Քանի-որ տողերը նույնպես iterable են, նրանց հետ շատ հարմար ձևով կարող ենք աշխատել for of ցիկլի օգնությամբ։ Ցիկլը անցնում է տողի յուրաքանչյուր տառի վրայով, toLowerCase ներդրված մեթոդի միջոցով տառերը վերածում է փոքրատառի, հետո ձայնավորների vowels զանգվածի վրա կանչվում է includes մեթոդը, որը վերադարձնում է բուլյան արժեք, այսինքն true, եթե տառը գտել է զանգվածի մեջ և false, եթե չի գտել այն։ Ամեն անգամ երբ vowels.includes(char) - ը ստանում է true արժեք, counter անվանված փոփոխականի արժեքը 1-ով ավելանում է։ Եվ ամենավերջում, ֆունկցիան վերադարձնում է հենց այդ counter փոփոխականը։
Խնդիրը շատ ավելի գեղեցիկ ու կարճ կարելի է լուծել regular expression-ի օգնությամբ։
function findVowels(str) {
const matched = str.match(/[aeiou]/gi);
return matched ? matched.length : 0;
}
Այստեղ մենք օգտագործում ենք ներդրված match մեթոդը, որը կանչվում է տողի վրա, և որպես պարամետր ստանում է regular expression։ /[aeiou]/
արտահայտությունը նշանակում է, որ մենք տողի մեջ ման ենք գալիս քառակուսի փակագծերի մեջ նշված տառերը։ Դրանից հետո գրված g (global) տառը ինտերպրետատորին հասկացնում է, որ որոնումը պետք է անել մինչև վերջ, ոչ թե առաջին համընկնումը գտնելու դեպքում այն դադարեցնել։ g-ից հետո գրված i տառը նշանակում է, որ որոնման ժամանակ չպետք է հաշվի առնվի տառի մեծատառ կամ փոքրատառ լինելը։ Օրինակ /a/i-ն նշանակում է, որ մեզ պետք է ինչպես a-ն, այնպես էլ A-ն։ Եվ այսպիսով match մեթոդը ավարտելով որոնումը, վերադարձնում է զանգված, որը պարունակում է բոլոր համընկած տառերը (կոնկրետ մեր օրինակում՝ ձայնավորները)։ Համընկնում չլինելու դեպքում այն վերադարձնում է null: Մեզ մնում է ընդամենը պարզել զանգվածի մեջ գտնվող տառերի քանակը, ինչը շատ հեշտ կարող ենք անել զանգվածի length մեթոդի օգնությամբ։
Այսպիսով վերջին տողում թերնար (?) օպերատորի օգնությամբ, մենք ասում ենք, եթե համընկնում կա, այսինքն match մեթոդը վերադարձրել է զանգված, ապա թող ֆունկցիան վերադարձնի այդ զանգվածի էլեմենտների քանակը, կոնկրետ մեր օրինակի դեպքում՝ ձայնավորների։ Եթե համընկնում չկա, այսինքն match մեթոդը վերադարձրել է null, ապա թող ֆունկցիան վերադարձնի 0։
match մեթոդի մասին առավել մանրամասն կարող եք ծանոթանալ այստեղ։