2016-03-05 93 views
2

我想计算文本中的字母并获取对象以显示每个单词的字母计数。计算文本中的字母并生成带结果的对象

因此,对于输入"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 } } 
+0

'让数= S => [] reduce.call(S,(A,C)=>(一[c] =(a [c] || 0)+ 1,a),{})',然后为每个单词分割并计数。 – elclanrs

+0

无法理解问题。你能解释一下什么是对象和你期望的输出? – vinit

+0

据我所知:你有一个字符串,你需要产生一个对象,其中包含文本的文字作为属性,每个属性包含一个对象,其中包含字母作为属性和单词中字母的数量作为值 – smnbbrv

回答

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功能,因此它在理论上是比最大Mastalerz的解决方案,它确实至少2次完整的循环更快通过拨打split函数两次。如果你真的不关心性能或您的文字通常很短,你可以使用的最大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")); 

这是做一样的,首先找到的话然后找到每个单词的字母。

+1

pftt ...完美主义者;)我还从我的代码 –

+0

@MaxMastalerz :)中删除了一个循环,只要他要求这样的事情,他就会实施一些工具来自动定义语言,或者计算大型文本中的单词,比如书或其他,所以这一切都可能涉及大文本扫描,这就是为什么我认为性能版本可能仍然有用 – smnbbrv

+0

@MaxMastalerz你正在生成一个循环,是的,但是由于'split'函数,你的代码中还有两个额外的循环。所以你有外循环计算单词和内循环计算每个单词的字母。如果总结所有内部循环,则将具有相同的两个完整扫描循环,或者换句话说,当我的第一个解决方案的复杂度为O(2N)时,O(3N)复杂度:一个_my_循环和一个来自' split'功能 – smnbbrv

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

+0

谢谢你的解释。 – spaceDog

+0

@spaceDog如果您发现这是“有帮助的答案”,请接受它。谢谢 –

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"));