2016-09-12 2 views
2

По какой-то причине VowelCount() учитывает только одну гласную в случае, когда имеется пара смежных гласных. Например, он считает «oe» в «идет» как один гласный. Я не понимаю, почему это происходит. Он делает это независимо от того, использую ли я функцию forEach или цикл for. Может ли кто-нибудь прояснить мое недоразумение?Почему моя функция VowelCount не возвращает правильное решение?

Вот мой код:

function VowelCount(str) { 
 
    var charArr = str.split(''); 
 
    var pattern = /[aeiou]/gi; 
 
    var vowelCount = 0; 
 
    /* 
 
    charArr.forEach(function(char) { 
 
    if (pattern.test(char)) { 
 
     //console.log(char); 
 
     vowelCount++; 
 
    } 
 
    }); 
 
    */ 
 
    for (var i = 0; i < charArr.length; i++) { 
 
    //console.log(charArr[i]); 
 
    if (pattern.test(charArr[i])) vowelCount++; 
 
    } 
 
    return vowelCount;    
 
} 
 

 
console.log(VowelCount("goes"));

+3

Согласно [ '.test()' метод DOCO] (https: //developer.mozilla .org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test), * "как в случае с' exec() '(или в сочетании с ним),' test() 'вызывает несколько раз на том же глобальный экземпляр регулярного выражения будет продвигаться мимо предыдущего совпадения ». * Таким образом, удаление' g' исправляет вашу проблему, так же как и создание нового объекта регулярного выражения на каждой итерации цикла, делая if (/ [aeiou] /gi.test (charArr [i])) ... ' – nnnnnn

+1

PS 'return (str.match (/ [aeiou]/gi) || []). length' даст вам количество гласных без необходимости в цикле. – nnnnnn

ответ

1

Я не знаю, почему, но глобальный поиск /g вызывает к сбою на e. Вам не нужен глобальный поиск, так как вы все равно проверяете отдельные символы.

Вот рабочая версия:

function VowelCount(str) { 
    var pattern = /[aeiou]/i; 
    var vowelCount = 0; 

    for (var i = 0; i < str.length; i++) { 
     if (pattern.test(str[i])){ 
      vowelCount++; 
     } 
    } 
    return vowelCount; 
} 

console.log(VowelCount("goes")); //2 

Я также изменил его так, что вам не нужно, чтобы превратить его в массив символов. Поведение вокруг строки достигает того же конца.

+1

Вы считаете правильным удалить флаг "g". При использовании g регулярное выражение будет поддерживать свойство lastIndex, которое становится расширенным и не сбрасывается до тех пор, пока не произойдет ложный результат. –

+0

@jeffcarey, что полезно знать - я очень мало отношусь к регулярному выражению, и это определенно сработало бы, если бы я был OP. –

0

Вы можете достичь количества гласных, используя ваш шаблон и функцию match(). Таким образом, вам не нужно перебрать массив и вы получите свой счет, если он соответствует:

var chars = 'fred is a flintstone'; 
var pattern = /[aeiou/gi; 
var matches = chars.match(pattern); 
var vowelCount = matches ? matches.length : 0; 
+0

Или, как я уже говорил выше, вы можете сделать это в одной строке: 'return (str.match (/ [aeiou]/gi) || []). Length' ... – nnnnnn

+0

hmm yea, это немного slicker, хотя я как правило, пытаются прочесть вещи немного больше для OP, чтобы показать шаги (да, по общему признанию, я использовал тройной без объяснения причин). Не видел ваш комментарий, прежде чем я отправил сообщение. – scrappedcola

1
function VowelCount(subject) { 
    console.log(subject.match(/[aeiou]/gi)); 
    // or to get the length 
    console.log(subject.match(/[aeiou]/gi).length); 
} 

VowelCount("goes"); 
//result -> ["o", "e"] 
Смежные вопросы