JavaScript如何统计名称数组中字符'l'的总出现次数
JavaScript统计数组内字符串指定字符总出现次数的实现方案
indexOf 单次调用只能返回目标字符第一次出现的索引,无法统计单个字符串内重复出现的字符,也不会自动遍历数组累加计数,这是你之前实现失败的核心原因。
以下是几种可实现需求的方案:
方法1:split() 分割法(简洁易读)
利用split按目标字符分割字符串,分割后得到的数组长度减1,就是当前字符串中目标字符的出现次数,配合reduce做累加即可,代码可读性很高。
const nameList = ["earth (c-137)","abadango","citadel of ricks","worldender's lair","anatomy park","interdimensional cable","immortality field resort","post-apocalyptic earth","purge planet","venzenulon 7","bepis 9","cronenberg earth","nuptia 4","giant's town","bird world","st. gloopy noops hospital","earth (5-126)","mr. goldenfold's dream","gromflom prime","earth (replacement dimension)","testicle monster dimension","signus 5 expanse","earth (c-500a)","rick's battery microverse","the menagerie","earth (k-83)","hideout planet","unity's planet","dorian 5","earth (unknown dimension)","earth (j19ζ7)","roy: a life well lived","eric stoltz mask earth","earth (evil rick's target dimension)","planet squanch","glaagablaaga","resort planet","interdimensional customs","galactic federation prison","gazorpazorp"]; const totalLCount = nameList.reduce((acc, cur) => { // 若需忽略大小写,可改为 cur.toLowerCase().split('l').length - 1 return acc + cur.split('l').length - 1; }, 0); console.log(totalLCount);
方法2:正则匹配法
用带全局匹配符g的正则匹配所有目标字符,匹配结果数组的长度就是当前字符串的字符出现次数;注意没有匹配到结果时match会返回null,需要做判空处理避免报错。
const totalLCount = nameList.reduce((acc, cur) => { // 若需同时匹配大写L,正则改为 /l/gi 即可 const matchRes = cur.match(/l/g); return acc + (matchRes ? matchRes.length : 0); }, 0);
方法3:双层循环遍历(逻辑直白)
最基础的实现方式,没有额外API门槛,适合新手理解逻辑:外层遍历数组每一个字符串项,内层遍历当前字符串的每一个字符,匹配到目标字符就给计数器加1。
let totalLCount = 0; for (let i = 0; i < nameList.length; i++) { const currentStr = nameList[i]; for (let j = 0; j < currentStr.length; j++) { if (currentStr[j] === 'l') { totalLCount++; } } }
方法4:正确使用indexOf的实现
如果要沿用你之前尝试的indexOf方法,只需要循环调用即可:每次找到目标字符后,把查找起始位置设为当前匹配位置的下一位,直到indexOf返回-1(表示当前字符串没有更多匹配项),就能统计出单个字符串内所有重复的目标字符。
let totalLCount = 0; for (let i = 0; i < nameList.length; i++) { const currentStr = nameList[i]; let findPos = currentStr.indexOf('l'); while (findPos !== -1) { totalLCount++; // 从匹配位置的下一位继续向后查找 findPos = currentStr.indexOf('l', findPos + 1); } }
注意:以上所有示例默认严格匹配小写字母
l,如果需要忽略大小写统计,只要在匹配前把当前字符串统一调用.toLowerCase()转成小写即可。
内容的提问来源于stack exchange,提问作者Ignacio Garcia
相关产品推荐
相关产品推荐

