Javascript 编写一个函数,该函数接收字符串并返回每个字符串的计数

Javascript 编写一个函数,该函数接收字符串并返回每个字符串的计数,javascript,Javascript,我真的被困在解决这个简单的问题上了。无论如何,我找到了另一种方法来解决这个问题,但我无法用我的代码解决这个问题 function charCout(str) { str = str.toLowerCase(); var f = {}; for(let i =0;i<str.length;i++) { if(str[i] === " ") { continue; } e

我真的被困在解决这个简单的问题上了。无论如何,我找到了另一种方法来解决这个问题,但我无法用我的代码解决这个问题

function charCout(str)
{
    str = str.toLowerCase();
    var f  = {};

    for(let i =0;i<str.length;i++)
    {
        if(str[i] === " ")
        {
            continue;
        }
        else{
            if(str[i] in Object.keys(f))
            {
                f[str[i]] += 1;
            }
            else
            {
                f[str[i]] = 1;
            }
        }
    }
  return(f);   
}




input: charCout("my name is Khan23")
expected output: {2: 1,3: 1,a: 2,e: 1,h: 1,i: 1,k: 1,m: 2,n: 2,s: 1,y: 1}
what i got: {2: NaN,3: NaN,a: 1,e: 1,h: 1,i: 1,k: 1,m: 1,n: 1,s: 1,y: 1}
函数charCout(str)
{
str=str.toLowerCase();
var f={};

对于(设i=0;i您正在使用错误的to方式来检查键是否位于对象中)

您可以使用
|
操作符将
if-else
压缩为单行

f[str[i]] = f[str[i]] + 1 || 1 
它检查
f[str[i]]
是否已经存在。如果
str[i]
不是
f
的键,则
f[str[i]
将返回
undefined
undefined+1
将为
NaN

NaN
是一个伪值,因此
NaN | 1
将计算为
1

如果
f[str[i]]
存在,则它将返回大于
0
的任何数字,因此它将被设置为
f[str[i]]+1
(递增1)

函数字符数(str)
{
str=str.toLowerCase();
var f={};

对于(设i=0;i您可以使用
str.split(“”)
获取字符列表,然后执行以下操作

const splitted = str.split("");
const result = {};
splitted.map(letter => result[letter] ? result[letter]++ : result[letter] = 1)

这只是一个想法

只需通过类型强制查看属性是否存在,例如:
if(f[str[i]])

函数字符数(str)
{
str=str.toLowerCase();
var f={};
对于(设i=0;i使用
Object.keys(f).包含(str[i])
而不是对象中的
str[i]。keys(f)
是解决方案

中,操作符主要检查对象是否提供特定属性

Mozilla doc将继续提供帮助

以下函数的变化将起作用

function charCout(str)
{
    str = str.toLowerCase();
    var f  = {};

    for(let i =0;i<str.length;i++)
    {
        if(str[i] === " ")
        {
            continue;
        }
        else{
            if(Object.keys(f).includes(str[i]))
            {
                f[str[i]] += 1;
            }
            else
            {
                f[str[i]] = 1;
            }
        }
    }
  return(f);   
}
函数charCout(str)
{
str=str.toLowerCase();
var f={};
对于(设i=0;i您可以利用并解决此问题。有关详细信息,请查看代码中的注释:

const charCount=s=>{
//创建字符串中的字符数组(过滤掉空格)
常量chars=s.split(“”).filter(char=>char.trim());
//使用reduce创建引用映射-每次遇到字符时递增1
返回字符。减少((累计,字符)=>{
累计[字符]=累计[字符]?累计[字符]+1:1;
返回累计;
}, {});
};

log(charCount(“我的名字是Khan23”)
谢谢大家的建议。我终于发现了我的代码有什么问题

function charCout(str)
{
    str = str.toLowerCase();
    var f  = {};

    for(let i =0;i<str.length;i++)
    {
        if(str[i] === " ")
        {
            continue;
        }
        else{
            if(str[i] in Object.keys(f))
            {
                f[str[i]] += 1;
            }
            else
            {
                f[str[i]] = 1;
            }
        }
    }
  return(f);   
}




input: charCout("my name is Khan23")
expected output: {2: 1,3: 1,a: 2,e: 1,h: 1,i: 1,k: 1,m: 2,n: 2,s: 1,y: 1}
what i got: {2: NaN,3: NaN,a: 1,e: 1,h: 1,i: 1,k: 1,m: 1,n: 1,s: 1,y: 1}
我的缺陷代码的输入和输出如下:

输入:charCout(“我的名字是Khan23”)

预期输出:{2:1,3:1,a:2,e:1,h:1,i:1,k:1,m:2,n:2,s:1,y:1}

我得到的:{2:NaN,3:NaN,a:1,e:1,h:1,i:1,k:1,m:1,n:1,s:1,y:1}

我使用了“in”操作符来确定Object.keys(f)数组中是否存在字符串的特定值。这正是我出错的地方


参考后,我知道“in”不能用于使用索引处的值过滤数组。

你只需要在f
str[i],而不是在Object.keys(f)中
str[i]
。如果你要得到所有键的数组,你需要做
Object.keys(f).includes(str[i])
(但效率非常低).
| |
不会检查密钥是否存在。如果你真的想这样做,请解释它到底是如何工作的。@Bergi我已经添加了一个解释。谢谢。我认为
f[str[I]]=(f[str[I]| | 0)+1
更容易理解。或者只需在f[str[I]:0中使用显式的
(str[I]+1
我的做法与@maheer完全相同。我对这种方法没有问题。我只是想弄清楚上面的代码(我的代码)有什么问题从技术上讲,这并不是对它存在的真正检查,但在这种情况下是有效的,因为当它存在时,值总是真实的exist@charlietfl谢谢。我在
str[I]时将条件修改为补丁
0@CharlieH
|| 0
在一个系统中没有任何意义condition@Bergi是的。我错了。编辑过。Ty abhishek。现在我用我的代码解决了问题。我们不能用“in”运算符过滤索引处的值的数组。