JavaScript计算一个字符串中的字符,而不是另一个字符串中的字符?

JavaScript计算一个字符串中的字符,而不是另一个字符串中的字符?,javascript,arrays,string,Javascript,Arrays,String,我正在处理一个函数,该函数应该将字符串作为参数,并将其作为对象文本返回,其中键是字符串的每个字母,值是该字母在字符串中出现的次数(不包括空格) 我已经想出了一个似乎有效的代码,但是,它似乎只对我传递的第一个字符串有效,而对第二个字符串无效。我在下面的代码中提供了两个字符串及其预期结果: 功能频率(str){ var freq={}; str=str.replace(/\s/g,“”)。split(“”); for(设i=0;i

我正在处理一个函数,该函数应该将字符串作为参数,并将其作为对象文本返回,其中键是字符串的每个字母,值是该字母在字符串中出现的次数(不包括空格)

我已经想出了一个似乎有效的代码,但是,它似乎只对我传递的第一个字符串有效,而对第二个字符串无效。我在下面的代码中提供了两个字符串及其预期结果:

功能频率(str){
var freq={};
str=str.replace(/\s/g,“”)。split(“”);
for(设i=0;i//{a:6,n:2,i:2,t:2,l:2,v:1}
每当您点击一个字母时,您都会将该值初始化为
0
,即使该字母之前存在:

freq[str[i]] = 0;
内部循环是冗余的。只要在遇到当前字母时初始化/增加它

freq[str[i]] = // set the current letter in the freq object
  (freq[str[i]] || 0) // take the current value or 0 if it doesn't exist
   + 1; // add 1 to the current value
功能频率(str){
var freq={};
str=str.replace(/\s/g,“”)。split(“”);
for(设i=0;i//{a:6,n:2,i:2,t:2,l:2,v:1}
我认为您在这里混淆了一些步骤,重置每个字母的计数,然后再次计数

但无论如何,为什么要运行嵌套循环?只需使用两个循环:

  • 迭代所有字母,用
    0
  • 迭代所有字母,增加相应的字段
  • 或者,将其合并为一个:

    function frecuencias(str) {
      var freq = {};
      str = str.replace(/\s/g, "").split("");
      for (let i in str) {
        freq[str[i]] = (freq[str[i]] + 1) || 1;
      };
      
      return freq;
    };
    
    转换一个(净化的…没有空格)然后运行一个任务来映射/注册/收集字符计数怎么样

    功能频率(val){
    返回(
    (typeof val==='string')&&
    […val.replace((/\s+/g),'')。reduce((obj,char)=>
    ((obj中的字符)和&++obj[char]| |(obj[char]=1))&&obj,
    {}
    )
    )| | val;/| |{}
    }
    控制台日志(frecuencias('hola mundo'));
    //{h:1,o:2,l:1,a:1,m:1,u:1,n:1,d:1}
    控制台日志(frecuencias(“anita lava la tina”);
    //{a:6,n:2,i:2,t:2,l:2,v:1}
    控制台日志(频率(“”));//{}
    console.log(frecuencias(null));//无效的
    console.log(frecuencias());//未定义

    .as console wrapper{min height:100%!important;top:0;}
    对于这样的问题,我们很高兴也能证明实际的结果是不正确的,因此我们不必自己运行它。如果运行代码,第一个字符串字母的计数是正确的,但是对于第二个,“a”字符的计数是2,但是它在字符串中出现了6次,因此无法正确计数。非常感谢您的回答。我知道代码是有效的。我使用的是if,因此只有当字母重复时,它才会增加。如果没有太多问题,请您澄清您提供的代码是如何根据字母在字符串中出现的次数计算的?请参阅更新的答案谢谢,我现在明白了。递增当前字母种类的语句计算为“如果存在,按当前值+1递增”,“如果不使用0或当前值+1递增”。再次感谢您。感谢您抽出时间回答。代码是可以工作的,但是,我在两周前就开始学习编程了,我不明白您的代码部分是如何工作的,很可能是因为我还没有学习ECMA脚本的大部分内容。再次感谢你。我们必须更加努力地学习,重新审视你的答案。@LuisGonzalez。。。不客气;慢慢来。如果有问题要问,不要犹豫。玩得高兴
    function frecuencias(str) {
      var freq = {};
      str = str.replace(/\s/g, "").split("");
      for (let i in str) {
        freq[str[i]] = (freq[str[i]] + 1) || 1;
      };
      
      return freq;
    };