计算字符串中的所有字符

时间:2017-06-13 04:20:22

标签: 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'));
&#13;
&#13;
&#13;

输出:

{ b: 0, a: 3, n: 2 } 

这显然是错误的。

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

9 个答案:

答案 0 :(得分: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'));

但是,您不需要嵌套循环。您的外.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将为Route::get('display-pdf', 'ReportAuditController@exportPDF'); ,这是真实的。

答案 1 :(得分:4)

我使用 reduce 操作,就像这样

&#13;
&#13;
const str = "banana"
const charCounts = Array.from(str).reduce((counts, char) => {
  counts[char] = (counts[char] || 0) + 1
  return counts
}, Object.create(null))

console.info(charCounts)
&#13;
&#13;
&#13;

答案 2 :(得分:3)

实际上,你可以通过更好的表现来计算,你的循环超过了你的需要!

&#13;
&#13;
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'));
&#13;
&#13;
&#13;

答案 3 :(得分:1)

我认为只有forEach才能使用forforeach循环。这是代码。

&#13;
&#13;
function countAllCharacters(str) {
  var a = str.split("");
  var obj = {};
  a.forEach(function(s) {
    if (obj[s]) {
      obj[s] = obj[s] + 1;
    } else {
      obj[s] = 1;
    }
  });
  return obj;
}

console.log(countAllCharacters('banana'));
&#13;
&#13;
&#13;

希望有所帮助:)

答案 4 :(得分:1)

这里的问题是,当计数尚未完成时,您分配obj[a[j]] = count;。您应该将function(s)更改为:

  function(s){
    var count=0;
    for(var j=0;j<a.length;j++){
      if(s==a[j]){
        count+=1;
      }
    }
    obj[s]=count;
  }

另一条评论:您的代码效率非常低,即O(n^2)。您可以进一步简化它以获得O(n)算法:

  function(s){
    if (obj[s] == undefined) {
       obj[s] = 1;
    } else {
       obj[s] = obj[s] + 1;
    } 
  }

答案 5 :(得分:0)

我意识到这不是最漂亮的,但我希望它能说明如何使用控制台来帮助调试循环。

function countAllCharacters(str) {
  var a = str.split("");
  var obj = {};
  a.forEach(function(s){
  console.log(s);
    var count=0;
    for(var j in a){

      // commas can come in really handy and help avoid huge debug blocks.
      console.log('_',j,s,a[j]); 

      if(s==a[j]){
        console.log('count++');
        count++;
      }
      obj[s] = count;
    }
  });
  return obj;
}

console.log(countAllCharacters('banana'));

答案 6 :(得分:0)

您必须在obj[a[j]]=count声明中加入if

这应该返回正确的结果

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'))

obj中的增量也必须满足if语句。

答案 7 :(得分:0)

已经有很多朋友提交了他们的观点和不错的解决方案。这是我用最简单的代码解决的方法:

const count = (string) => string
  .split("")
  .reduce((acc, val) => (acc[val] ? (acc[val]++) : (acc[val]=1), acc),
{});

希望您喜欢我的代码。谢谢。

答案 8 :(得分:0)

function countAllCharacters(str) {
   let newArr = str.split('');  // splits the string into a new array
   let obj = {};  // initiliza an empty object

   newArr.forEach(char => (obj[char]) ? obj[char] += 1 : obj[char] = 1);
   return obj; 
}