Javascript 如何计算特定字符在字符串中的次数

Javascript 如何计算特定字符在字符串中的次数,javascript,arrays,string,Javascript,Arrays,String,我试图创建一个函数,查看数组中是否有任何字符在字符串中,如果是,有多少个字符 我试着计算每一种模式,但太多了。我尝试使用Python中“in”操作符的替代方法,但效果并不理想 function calc_fit(element) { var fitness_let = ["e", "l", "m", "n", "t"] } } 元素是字符串,fitness\u let数组是我需要检查的数组,看看它们是否在字符串中,如果在字符串中,有多少个。一种方法是迭代数组并对每个字母执行全局正则表

我试图创建一个函数,查看数组中是否有任何字符在字符串中,如果是,有多少个字符

我试着计算每一种模式,但太多了。我尝试使用Python中“in”操作符的替代方法,但效果并不理想

function calc_fit(element) {
  var fitness_let = ["e", "l", "m", "n", "t"]

  }
}

元素是字符串,fitness\u let数组是我需要检查的数组,看看它们是否在字符串中,如果在字符串中,有多少个。

一种方法是迭代数组并对每个字母执行全局正则表达式删除。然后,将替换的字符串长度与原始输入长度进行比较,以确定出现的次数

功能计算配合(元素){
var fitness_let=[“e”、“l”、“m”、“n”、“t”];
对于(var i=0;i计算拟合(输入)
如果您想获得每个字符出现的次数,您可以使用
reduce
Map

让getTotal=(元素)=>{
让适应度=[“e”、“l”、“m”、“n”、“t”]
让newMap=newMap(fitness.Map(v=>[v,v]))
返回元素。拆分(“”)。减少((op,inp)=>{
if(newMap.has(inp)){
op[inp]=op[inp]| | 0
op[inp]++
}
返回操作
},{})
}
log(getTotal('element'))

log(getTotal('eleabc'))
您可以创建一个哈希映射,并利用它来统计找到的所有实例

例如:

const counts={};
[“e”、“l”、“m”、“n”、“t”]。forEach(e=>计数[e]=0);
const-letters=“嘿,看!一个字符串!”.split(“”);
const results=字母。reduce((acc,curr)=>{
如果(acc.hasOwnProperty(curr)){acc[curr]+=1;}
返回acc;
},计数);

控制台日志(结果)您可以使用映射和过滤器对具有相同数组值的事件进行计数:

let str=“我喜欢JavaScript和Node.js”;
设arr=str.replace(/[^a-zA-Z]/g')。split(“”);
const-mapped=[…新集合(arr)].map(a=>`${a}发生${arr.filter(a1=>a1===a).length}时间`;

console.log(映射)calc_-fit()
也将字母数组作为参数,则效果会更好。然后,您可以从数组中创建一个,每个字母的计数器从
0
开始。最后,遍历字符串并在需要时增加每个字母的相应计数器

函数计算拟合(元素,拟合)
{
//从要搜索的字母数组创建地图。
let map=newmap(fitness_let.map(l=>([l,0]));
//遍历字符串和字母的增量计数器。
for(元素常数c)
{
如有(地图编号(c))
map.set(c,map.get(c)+1);
}
返回图;
}
让res=calc_-fit(“这是一个带有一些字母的字符串”、[“e”、“l”、“m”、“n”、“t”);
res.forEach((counter,letter)=>console.log(`${letter}=>${counter}`)
.as控制台{背景色:黑色!重要;颜色:石灰;}

.作为控制台包装{max height:100%!important;top:0;}
这里有一个稍微不同的方法,它依赖于函数生成器

与其他解决方案相比,没有相关的理由使用此解决方案,但它允许在整个循环中提供额外的控制

作为旁注,字符串只迭代一次,因此整个“迭代”周期应该相当快

解释直接在下面的代码中

输出是一个对象,其中每个键都是一个字符,保存出现的数量,保存所有搜索的指针

如果未传递搜索的字符数组,它将自动构建在calc_fit函数中,这将分别返回大写和小写的匹配项,包括标点符号和符号。但这很容易定制

//迭代字符串并生成当前循环字符(如果它存在于字符列表中)。
函数*匹配字符{
for(s的var char){
if(chars.indexOf(char)>-1)产生{char:char};
}
}
//不确定为什么函数在原始代码中以这种方式命名,但嘿,这是OP的函数名。
函数计算拟合(元素、字符){
chars=chars | |[…新集合(元素)];
//从上面的数组中构建一个对象,其中结构的键是char,值最初是0。
const matchList=chars.reduce((acc,next)=>(acc[next]=0,acc),{});
//迭代所有匹配项。对于每个匹配项,它会增加matchList的匹配项数量。
for(matchChars(element,chars)的var匹配)匹配列表[match.char]++;
//最后,返回matchList。
返回匹配列表;
}
//断言:应该匹配所有字符。
日志(计算拟合('元素',[“e”,“l”,“m”,“n”,“t”));
//断言:应该返回所有零。
日志(计算拟合(“”,[“e”,“l”,“m”,“n”,“t”));
//断言:应该自动检测字符,甚至大小写。

log(calc_-fit('hello,world.ThIs beatiful!'))我爱我一些扩展语法。您可以通过舍弃
return
并使用字符串来缩短代码interpolation@mwilson:谢谢,伙计,是的,这里确实不需要返回,我不知道为什么堆栈溢出代码段在我使用Backtick时给了我语法错误。我见过JSFIDLE做同样的事情。@mwilson:啊,它起作用了,我笨拙的手指错了:)。感谢您的建议,您可以删除一些空格。你没有提到字节数。哦等待我还以为我在演呢…;-)这个问题怎么不重复?这是一个非常简单的问题,在JavaScript标签中已经提出了180多万个问题。@PeterMortensen好吧,如果你能找到一个傻瓜,就投个接近的一票。