计算字符串中的所有字符

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)

这显然是错的.

任何人都可以帮助我吗?我哪里错了?

nnn*_*nnn 5

必要的最小变化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.


Moh*_*ani 5

实际上,您可以通过更好的性能来衡量,您的循环次数超出了您的需要!

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)