我需要一些帮助来理解以下代码:
function AllChars(str) {
var myObj = {};
for(var i=0;i<str.length;i++){
if(myObj[str[i]]===undefined){
myObj[str[i]]=0;
}
myObj[str[i]]++;
}
return myObj;
}
AllChars('banana');
Output
{b: 1, a: 3, n: 2}
它基本上返回一个对象,其中每个键都是给定字符串中的一个字符。问题是:
for循环从0到字符串的长度。然后if函数检查str[0],它是第一个元素,应该是字母'b',然后这个字母'b'被添加到myObj[str[i]]]中。我不明白为什么myObj[str[0]在str[0]中是'b'时会被未定义?
1。AllChars
函数
函数将字符串作为参数,并在字符串(str
)中循环。。。对于每个循环,它检索字符串中的下一个字符。
-
现在,如果以前还没有遇到这个角色添加到"空"对象中作为键,其值为
0
。通过这种方式,它会创建一个该字符在字符串str
中出现次数的计数器。 -
否则(如果它(该字符:
str[i]
)已经遇到),无需在myObj
中再次对其进行索引。
在每个循环结束时,(当前字符的)计数器递增。
在函数结束时,返回myObj
。
2.AllChars('banana');
这一行调用上面定义的函数AllChars
,并将字符串'banana'
作为参数。
3.输出
输出向我表明,代码是从javascript控制台运行的,该控制台输出从AllChars('banana');
返回的myObj
的值
它要么是浏览器控制台,要么是node.js控制台。
因此,输出代表了那个(key=>value)对象。
{b: 1, a: 3, n: 2}
代码统计每个字母在给定字符串中出现的次数。如果还没有这样的字母,它会添加一个字母作为属性,并在增加后计数。
每当你试图从一个不存在的对象中获取东西时,它都会返回'undefined'。上面的代码只是利用该功能来检查myObj对象中是否存在"str"参数中的字母。
统计字符串中每个字符的出现次数。ES6解决方案更优雅:
const chars = string =>
[...string].reduce(
(all, e) => ({ ...all, [e]: !all[e] ? 1 : all[e] + 1 }),
{}
);
const chars = string =>
[...string].reduce(
(all, e) => ({ ...all, [e]: !all[e] ? 1 : all[e] + 1 }),
{}
);
console.log(
chars('bananaa')
)