在字符串中确定字符频率(Javascript)

5

我正在研究一种解决方案,用于确定字符串中字符的频率。字符已正确添加到我的对象中,但所有计数都最终变成NaN。(我认为我采用了不太高效的方法,将字符串拆分为字符数组,但无论如何,我都希望解决这种方法。)

var charFreq = function (frequencyString) {
    var stringArray = frequencyString.split("");
    var frequencies = {};
    for (var k in stringArray) {
        var nowLetter = stringArray[k];
        if (stringArray.hasOwnProperty(k)) {
            frequencies[nowLetter] += 1;
        }
    }
    return frequencies;
}

charFreq("what is the reason for this"); 

最好检查一下你的浏览器控制台来查看错误。对我来说,这似乎是一个简单的parse问题。这个代码可以解决你的问题:var nowLetter = +stringArray[k]; - Praveen
1
在递增之前,您需要在第一次为每个字母初始化频率。 - Julio
8个回答

4
你的 frequencies 是一个对象,当你访问它时
frequencies[nowLetter] += 1;

您正在访问以前不可用的属性,如frequencies.a,它将是undefined。因此您会得到NaN。

请参见http://jsfiddle.net/xbUtR/进行修复。

if(frequencies[nowLetter] === undefined)
                frequencies[nowLetter] = 0;
            frequencies[nowLetter] += 1;

3

frequencies[nowLetter] 在你的代码中未定义。

更好的解决方法:

function charFreq(txt){
    var obj = {};
    for(var i = 0; i < txt.length; i++){
        obj[txt[i]] = ++obj[txt[i]]||1;
    }
    return obj;
}

1
那是不正确的,k只是索引。他的代码是正确的。 - Liam Bigelow
这只是数字,你可以简单地执行 obj[txt[i]] = ++obj[txt[i]] || 1 - elclanrs

3

由于 frequencies 中的属性值有一个初始值为 undefined,而 undefined + 1 == NaN,因此请尝试像这样编写代码:

var charFreq = function (frequencyString) {
    var stringArray = frequencyString.split("");
    var frequencies = {};
    for (var k in stringArray) {
        var nowLetter = stringArray[k];
        if (stringArray.hasOwnProperty(k)) {

            // One way to initialize the value -- not the only way.
            if (!frequencies[nowLetter]) {
              frequencies[nowLetter] = 0;
            }

            frequencies[nowLetter] += 1;
        }
    }
    return frequencies;
}

1

有许多方法,特别是如果效率不是问题:

var frequencies = function (s) {
    var f = {};
    s.split("").forEach(function (e, i, a) {
        f[e] = f[e] || 0;
        f[e] += 1;
    });
    return f;
}

调用 frequencies("thiss") 将得到 Object {t: 1, h: 1, i: 1, s: 2}


0

函数式编程介绍 - 编程学校演示 带有粗箭头 =>:

var charFreq = (string) =>
   string
        .split('')
        .sort()
        .join('')
        .match(/(\w)\1*/g)
        .map(letters => [letters[0], letters.length])
        .sort((a,b) => {
                return a[1] !== b[1] ? (a[1] < b[1]) : (a[0] > b[0]);
        })

console.log(charFreq('what is the reason for this'));

0
function highestFreqChar(str) {
    var charMap = {};
  for (var i=0; i<str.length; i++) {
    var character = str.charAt(i);
    if (charMap[character]) {
        charMap[character]++;
    } else {
        charMap[character] = 1;
    }
  }

  var max = -1;
  var result = "";
  for (var j=0; j<str.length; j++) {
    if (max < charMap[str.charAt(j)]) {
        max = charMap[str.charAt(j)];
      result = str.charAt(j);
    }
  }
  return {result : result, charmap: charMap};
}

0

您可以在不创建数组的情况下逐个遍历字符。

var charFreq= function(frequencyString){
    var next, i= 0, frequencies= {},
    L= frequencyString.length;
    while(i<L){
        next= frequencyString.charAt(i++);
        if(!frequencies[next]) frequencies[next]= 0;
        ++frequencies[next];
    }
    return frequencies;
}

//demo 
JSON.stringify(charFreq("what is the reason for this"));

/*  returned value: (String)
{"w":1,"h":3,"a":2,"t":3," ":5,"i":2,"s":3,"e":2,"r":2,"o":2,"n":1,"f":1}

*/


0
function calculateFrequency(string) {
const alphabet ='abcdefghijklmnopqrstuvwxyz'
const alphabetUp = alphabet.toUpperCase()
let freq=[26] 
for(let i in alphabet){
   freq[i]=0
    for(let j in string ){
         if(alphabet[i] == string[j] || alphabetUp[i] == string[j] ){
        freq[i] = freq[i] + 1
        }
    }

    if(freq[i] != 0){
        console.log(alphabet[i] + ' : ' + freq[i])
    }
 }
}

这种方法可以计算字符数,不考虑大小写(大写或小写)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接