用javascript写一个简单的解码功能

时间:2018-09-30 09:04:47

标签: javascript decoding

我是javascript的初学者,我尝试编写一个简单的解码功能。 在这里:

function decode(text) {
let letter, count, i, result, letters;
result = "";
for (i = 0; i < text.length; i++) {
        count = text[i];
        if (typeof Number(count) === "number") {               
            count = Number(count);
            console.log(count);  // this line only for testing
            letter = text[i + 1];
            letters = letter.repeat(count);
            result += letters;
            console.log(result);  // this line only for testing
        } else {
            result += text[i];
        }
    }
    return result;
}
console.log(decode("v2rt3b2x"));

我需要帮助来理解为什么当typeof Number(count)===“ number”为false时,为什么不会跳过if子句。 它返回以下内容:

NaN
VM708:12 
VM708:8 2
VM708:12 rr
VM708:8 NaN
VM708:12 rr
VM708:8 NaN
VM708:12 rr
VM708:8 3
VM708:12 rrbbb
VM708:8 NaN
VM708:12 rrbbb
VM708:8 2
VM708:12 rrbbbxx
VM708:8 NaN

正如我说的,我是一个初学者,所以请保持怜悯...

我得到了正确的答案,但是我稍后会尝试找出计数的原因-1有用,现在我感谢大家的帮助。

function decode(text) {
let letter, count, i, result, letters;
result = "";
for (i = 0; i < text.length; i++) {
    count = parseInt(text[i]);
    if (!isNaN(count)) {               
        //console.log(count);  // this line only for testing
        letter = text[i + 1];
        letters = letter.repeat(count-1);
        //console.log(letters);
        result += letters;
        //console.log(result);  // this line only for testing
    } else {
        result += text[i];
    }
}
return result;
}
console.log(decode("v2rt3b2xz3f2d 2s2 j"));
vrrtbbbxxzfffdd ss  j

3 个答案:

答案 0 :(得分:3)

typeof Number(x)始终为'number',无论x是什么。您实际上是将x类型转换为'number'类型。

因此if子句始终为true,永远不会被跳过。

答案 1 :(得分:3)

问题在这里。

typeof Number(count) === "number"

当您尝试将某些内容转换为数字时,如果不可能,您将获得NaN作为值。而typeof NaNnumber

详细了解NaN

在您的if语句中添加Number.isNaN检查将是解决方案。

function decode(text) {
let letter, count, i, result, letters;
result = "";
for (i = 0; i < text.length; i++) {
        count = text[i];
        var parsedNumber = Number(count);
        if (!Number.isNaN(parsedNumber)) {               
            letter = text[i + 1];
            letters = letter.repeat(parsedNumber);
            result += letters;
            console.log(result);  // this line only for testing
        } else {
            result += text[i];
        }
    }
    return result;
}
console.log(decode("v2rt3b2x"));

答案 2 :(得分:2)

除了错误的比较之外,您还可以对字符串进行适当的分割并映射重复的字符。

服用

'v2rt3b23x'

并拆分

[
    "v2",
    "r",
    "t3",
    "b23",
    "x"
]

和映射

[
    "vv",
    "r",
    "ttt",
    "bbbbbbbbbbbbbbbbbbbbbbb",
    "x"
]

您获得join

'vvrtttbbbbbbbbbbbbbbbbbbbbbbbx'

console.log(
    'v2rt3b23x'
        .split(/(?=\D)/)
        .map(v => v[0].repeat(v.slice(1) || 1))
        .join('')
);