计算文本中的字母并生成带有结果的对象

时间:2016-03-05 04:59:32

标签: javascript algorithm

我正在尝试计算文本中的字母并获取一个对象来显示每个单词的字母数。

因此,对于输入"Argument here",预期输出将为:

{ Argument: { A: 1, r: 2, g: 1, u: 1, m: 1, e: 3, n: 1, t: 1, ' ': 1, h: 1 },
  here: { e: 2, h: 1, r: 1} }

我的尝试:

function LetterCountI(str) { 
 var arr = str.split(" "); var cCount = {}; var anotherO = {}; var final = {};
for(var i = 0; i < arr.length; i++){
    if(cCount[arr[i]]){
        cCount[arr[i]]++;
    } else {
        cCount[arr[i]] = 1;
    }
}        

var letterCount = str.split("");
 for(var j = 0; j < letterCount.length; j++){

    if(anotherO[letterCount[j]]){
        anotherO[letterCount[j]]++;
    } else {
        anotherO[letterCount[j]] = 1;
    }
    }

for(var property in cCount){
  final[property] = anotherO;
}

return final;

}

LetterCountI("Argument here");

我目前得到的是

{ Argument: { A: 1, r: 2, g: 1, u: 1, m: 1, e: 3, n: 1, t: 1, ' ': 1, h: 1 },
  here: { A: 1, r: 2, g: 1, u: 1, m: 1, e: 3, n: 1, t: 1, ' ': 1, h: 1 } }

3 个答案:

答案 0 :(得分:3)

JSFiddle,以下内容将计算构成字符串的字母中的字母:

function letterCounts(s) {
    var result = {};

    s.split(' ').forEach(function(e) {
        result[e] = {};
        e.split('').forEach(function(c) {
            if(!result[e][c]) { result[e][c]=0; }
            result[e][c]++;
        });
    });

    return result;
}

letterCounts('Argument Here');

结果是:

"{"Argument":{"A":1,"r":1,"g":1,"u":1,"m":1,"e":1,"n":1,"t":1},"Here":{"H":1,"e":2,"r":1}}"

enter image description here

答案 1 :(得分:1)

首先,您的方法可能会失败。如果您的文字仅包含__proto__或其他Object属性,则此属性会显示错误/意外结果。无论如何,如果您仍然确定要使用此方法而不是例如哈希地图,你可以继续下面的解决方案。

如果您关心更快的方法,可以使用以下代码:

function count(string) {
  var tmpname = '', tmpvalue = {}, result = {}, i = string.length;

  while (i--) {
    var letter = string[i];

    if (letter === ' ') {
      result[tmpname] = tmpvalue;
      tmpname = '';
      tmpvalue = {};
    }
    else {
      tmpname = letter + tmpname;
      tmpvalue[letter] = (tmpvalue[letter] || 0) + 1;
    }
  }

  if (tmpname) {
    result[tmpname] = tmpvalue;
  }

  return result;
}

console.log(count("Argument here"));

这不会调用split函数,因此它理论上比Max Mastalerz的解决方案更快,它通过调用split函数两次至少完成2个完整循环。如果你真的不关心性能或者你的文本通常很短,你可以使用更短版本的Max Mastalerz解决方案来解决这个问题:

function count(string) {
  return string.split(' ').reduce(function(a, b) {
    b.split('').reduce(function(c, d) {
      return (c[d] = (c[d] || 0) + 1 , c);
    }, a[b] = {});

    return a;
  }, {});
}

console.log(count("Argument here"));

它正在做同样的事情,首先找到单词,然后找到每个单词的字母。

答案 2 :(得分:0)

使用forEach是一种更简单的方法,但这里有点香草:

function countLetters(string) {
var obj = {};
var arr = string.split(' ');
for (var i = 0; i < arr.length; i++) {
  obj[arr[i]] = {};
  for (var j = 0; j < arr[i].length; j++) {
   if (!obj[arr[i]][arr[i][j]]) {
    obj[arr[i]][arr[i][j]] = 1;
   } else {
    obj[arr[i]][arr[i][j]]++;
  }
}
} return obj;
}



console.log(countLetters("Argument here"));