Kar*_*iya 1 javascript arrays object
我想计算字符串中的所有字符并将其返回给对象.我试过但我无法得到正确的答案.
这是我的代码:
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'));Run Code Online (Sandbox Code Playgroud)
输出:
{ b: 0, a: 3, n: 2 }
Run Code Online (Sandbox Code Playgroud)
这显然是错的.
任何人都可以帮助我吗?我哪里错了?
必要的最小变化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'));Run Code Online (Sandbox Code Playgroud)
但是,您不需要嵌套循环.您的外部.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'));Run Code Online (Sandbox Code Playgroud)
这可以通过以下方式缩短.reduce():
function countAllCharacters(str) {
return str.split("").reduce(function(obj, s){
obj[s] = (obj[s] || 0) + 1;
return obj;
}, {});
}
console.log(countAllCharacters('banana'));Run Code Online (Sandbox Code Playgroud)
请注意,(obj[s] || 0)是指使用obj[s]的值,如果它是truthy,否则使用0.因此,第一次遇到特定的字母obj[s]时undefined,这将是假的,因此0将被使用.你遇到的那封信,下一次obj[s]会1,这是truthy.
实际上,您可以通过更好的性能来衡量,您的循环次数超出了您的需要!
function countAllCharacters(str) {
var a = str.split("");
var obj = {};
for(var j=0;j<a.length;j++){
if(typeof obj[a[j]] !== 'undefined'){
obj[a[j]]+=1;
} else {
obj[a[j]]=1;
}
}
return obj;
}
console.log(countAllCharacters('banana'));Run Code Online (Sandbox Code Playgroud)