我想计算一个字符串中的所有字符并将其返回给一个对象。我试过了,但我无法得到正确的答案。
这是我的代码:
function countAllCharacters(str) {
var a = str.split("");
var obj = {};
a.forEach(function(s){
var count=0;
for(var j=0;j<a.length;j++){
if(s==a[j]){
count+=1;
}
obj[a[j]]=count;
}
});
return obj;
}
console.log(countAllCharacters('banana'));
输出:
{ b: 0, a: 3, n: 2 }
这显然是错误的。
有人可以帮我吗?我哪里错了?
最佳答案
最小的必要更改是 obj[a[j]]=count;
应该是 obj[s]=count;
,因为你有那条线正在运行内部循环的每次迭代,无论 j
是否指的是您当前正在计算的字母。
function countAllCharacters(str) {
var a = str.split("");
var obj = {};
a.forEach(function(s){
var count=0;
for(var j=0;j<a.length;j++){
if(s==a[j]){
count+=1;
}
obj[s]=count;
}
});
return obj;
}
console.log(countAllCharacters('banana'));
但是,您不需要嵌套循环。您的外部 .forEach()
可以直接更新当前字母的计数:
function countAllCharacters(str) {
var a = str.split("");
var obj = {};
a.forEach(function(s){
obj[s] = (obj[s] || 0) + 1;
});
return obj;
}
console.log(countAllCharacters('banana'));
这可以用 .reduce()
缩短:
function countAllCharacters(str) {
return str.split("").reduce(function(obj, s){
obj[s] = (obj[s] || 0) + 1;
return obj;
}, {});
}
console.log(countAllCharacters('banana'));
注意 (obj[s] || 0)
表示如果 obj[s]
为真则使用它的值,否则使用 0
。所以你第一次遇到一个特定的字母 obj[s]
将是 undefined
,这是错误的,所以 0
将被使用。下次您遇到那个字母时 obj[s]
将是 1
,这是真的。
关于javascript - 计算字符串中的所有字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44512332/