此问题已删除
答案 0 :(得分:2)
一个简单的循环就可以了。由于您使用的是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 +中为iterable。 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
选项很不错,很短,但是确实两次遍历了字符串。
答案 1 :(得分:0)
您可以使用一个对象进行检查和计数。
function countHashtagsAndMentions(str) {
var result = { '#': 0, '@': 0 },
i;
for (i = 0; i < str.length; i++) {
if (str[i] in result) ++result[str[i]];
}
return result;
}
var str = "So excited to start @coding on Monday! #learntocode #codingbootcamp";
console.log(countHashtagsAndMentions(str));
答案 2 :(得分:0)
使用Array#reduce
const message = "So excited to start @coding on Monday! #learntocode #codingbootcamp"
const res = message.split("").reduce((acc,cur)=>{
if('#@'.includes(cur)){
const key = cur === '#' ? 'hashtags' : 'mentions';
acc[key] = acc[key] + 1;
}
return acc;
}, {mentions: 0, hashtags: 0})
console.log(res);