2015-08-10 5 views
0

Этот код javascript должен принимать строку и возвращает количество гласных в массиве, но когда я запустил ее, я получаю сообщение о том, что мой s.split не является функцией. Кто-нибудь знает, что я делаю неправильно?Функция my forEach не работает

function countVowels(s){ 
    var vowels = /[aeiou]/i; 
    var count = 0 
    var array = s.split(''); 

    array.forEach(function(v){ 
     if(v == vowels) 
      count++; 
    }) 
    return count; 
} 
+1

Можете ли вы показать нам, как вы называете 'функция countVowels'? –

+0

Ваша ошибка возникнет, когда значение 's', переданное вашей функции, не является строкой. Ваша функция также не работает, потому что 'v == vowels' не выполняет регулярное выражение. Он сравнивается, чтобы увидеть, является ли 'v' реальным объектом регулярного выражения, который никогда не может быть так, что проверка всегда будет ложной. – jfriend00

+0

Это не то, как вы используете регулярное выражение. – epascarello

ответ

1

Я получаю сообщение, что мой ДЕЛЕНИЕ не является функцией.

См String.prototype.split():

Метод split() разбивает Строки объекта в массив строк, разделяя строку на подстроки.

Так что если параметр не является строковым типом (например, «abcdef»), это вызовет эту проблему.

И вы не должны использовать v === vowels, когда vowels является регулярным выражением. Когда вы используете ===, вы пытаетесь сравнить, являются ли v и vowels одним и тем же объектом. См. Equality comparisons and sameness для более подробной информации.

См RegExp.prototype.test():

test() Используйте каждый раз, когда вы хотите знать, найден ли шаблон в строке.

function countVowels(s) { 
 
    var vowels = /[aeiou]/i; 
 
    var count = 0; 
 
    var array = s.split(''); 
 

 
    array.forEach(function(v) { 
 
     if (vowels.test(v)) { 
 
      count++; 
 
     } 
 
    }); 
 

 
    return count; 
 
} 
 

 
console.log(countVowels('abcdefg'));

+2

Обратите внимание: OP ссылается на сообщение об ошибке 's.split', не являющееся функцией. Ваш ответ не затрагивает эту проблему, которая, если она встречается в коде OP, все равно будет проблемой в вашем коде. – jfriend00

+0

@ jfriend00 Thx. Обновлен ответ. – iplus26

0

передовое: s должен быть строкой, или s.split не будет существовать.

Кроме того, как утверждают другие, ваш тест не будет работать, потому что v == vowels попытается приравнять строку к регулярному выражению. Вы хотели бы использовать RegExp.prototype.test() метод:

if(vowels.test(v)) { ... } 

Наконец, есть уборщик способ подсчета гласных звуков в строке. Вы можете использовать String.prototype.match() вернуть все матчи и использовать длину этого массива:

function countVowels(str) { 
    return str.match(/[aeiou]/gi).length; 
} 
Смежные вопросы