for循环中的switch语句和if语句未完成

时间:2014-06-03 21:19:16

标签: javascript for-loop switch-statement

我试图找出字符串中每个字符的数量。

我已经搜索了一段时间,似乎无法弄清楚为什么我的switch语句在第一个案例后就停止了。

function charFreq(string){
    var splitUp = string.split("");
    console.log(splitUp);
    var a;
    var b;
    var c;
    var v;

    for (var i = 0; i<splitUp.length; i++){
        if (i<1){
            switch (splitUp[i]){
                case "a":
                 a = 1;
                break;
                case "b":
                 b = 1;
                break;
                case "c":
                 c = 1;
                break;
                case "v":
                 v = 1;
                break;
            }
        } else {
            switch (splitUp[i]){
                case "a":
                 a += 1;
                break;
                case "b":
                 b += 1;
                break;
                case "c":
                 c += 1;
                break;
                case "v":
                 v += 1;
                break;
            }
        } 
    } 
    console.log("There are " + a + " A's, " + b + " B's, " + c + " C's, and " + v + " V's.")
}

charFreq("aaabccbbavabac");

我做错了什么会使控制台读取:

  

有6个A,NaN B,NaN C和NaN V。

2 个答案:

答案 0 :(得分:1)

您的代码存在的问题是变量(abcv)未初始化。 for循环遍历字符,但只有第一次迭代为其中一个变量(等于字符)分配初始值。其余的循环尝试将这些变量的值增加1,但大多数(除了一个)都是未定义的。因此,要修复代码,请为变量分配初始值:

var a = 0;
var b = 0;
var c = 0;
var v = 0;

然后你可以简化你的for循环:

for (var i = 0; i < splitUp.length; i++) {
    switch (splitUp[i]) {
    case "a":
        a += 1;
        break;
    case "b":
        b += 1;
        break;
    case "c":
        c += 1;
        break;
    case "v":
        v += 1;
        break;
    }
}

但是用这种方式计算字符太复杂了。您可以使用更简单的代码,例如:

var str = "teststring";
var chars = [];

str.split('').map(function(char) {
  chars[char] = (chars[char] === undefined) ? 1 : chars[char] + 1;
});

console.log(chars); // [t: 3, e: 1, s: 2, r: 1, i: 1…]

答案 1 :(得分:0)

如果要初始化所有变量,那么if语句是多余的。它打破了你的逻辑,因为你只根据索引是否在第一个字符上而分配一个数字。