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”运算符过滤索引处的值的数组。