Простой цикл делает это.Поскольку вы используете синтаксис ES2015 +, for-of
будет хорошо работать:
function countHashtagsAndMentions(str) {
let hashtags = 0;
let mentions = 0;
for (const ch of str) {
if (ch === "#") {
++hashtags;
} else if (ch === "@") {
++mentions;
}
}
return {hashtags, mentions};
}
let str = "So excited to start @coding on Monday! #learntocode #codingbootcamp";
console.log(countHashtagsAndMentions(str));
Это работает, потому что строки повторяемы в ES2015 +.for-of
loop неявно использует итератор из строки для прохода по ее символам.Таким образом, в цикле ch
- это каждый символ строки.Обратите внимание, что в отличие от str.split()
, итератор строк не разделяет отдельно две половины символа, для которого требуется суррогатная пара (как и большинство смайликов), что обычно является тем, что вы хотите.
Это:
for (const ch of str) {
// ...
}
фактически совпадает с
let it = str[Symbol.iterator]();
let rec;
while (!(rec = it.next()).done) {
const ch = rec.value;
// ...
}
, но без переменных it
и rec
.
В качестве альтернативы, вы можете использовать replace
срегулярное выражение для замены всех символов, кроме тех, которые вы хотите считать.Похоже, это будет дороже, но это то, что движок JavaScript может оптимизировать:
function countHashtagsAndMentions(str) {
return {
hashtags: str.replace(/[^#]/g, "").length,
mentions: str.replace(/[^@]/g, "").length
};
}
let str = "So excited to start @coding on Monday! #learntocode #codingbootcamp";
console.log(countHashtagsAndMentions(str));
То, что вы используете, вероятно, частично зависит от длины строки.Опция replace
хороша и коротка, но проходит строку дважды.