2016-11-29 68 views
0

所以我有两个函数。我会都张贴在这里:Javascript“ch.match不是函数”

//A 
var ltrToNato = function(ch) { 
    var x = ch 
    var nato = 
    ('{"A": "Alpha", "B": "Bravo", "C": "Charlie", "D": "Delta", "E": "Echo", "F": "Foxtrot", "G": "Golf", "H": "Hotel", "I": "India", "J": "Juliet", "K": "Kilo",\ 
    "L": "Lima", "M": "Mike", "N": "November", "O": "Oscar", "P": "Papa", "Q": "Quebec", "R": "Romeo", "S": "Sierra", "T": "Tango", "U": "Uniform", "V": "Victor",\ 
    "W": "Whiskey", "X": "X-Ray", "Y": "Yankee", "Z": "Zulu", "0" : "Zero", "1" : "One", "2" : "Two", "3" : "Three", "4" : "Four", "5" : "Five", "6" : "Six",\ 
    "7" : "Seven", "8" : "Eight", "9" : "Niner"}') 
    var natoLower = nato.toLowerCase() 
    var natoAlpha = JSON.parse(nato) 
    var natoAlphaLower = JSON.parse(natoLower) 
    if (ch >= "A" && ch <= "Z") 
    return natoAlpha[ch] 
    else if (ch >= "a" && ch <= "z") 
    return (natoAlphaLower[ch]) 
    else if (x = x.match(/[0-9]/g)) 
    return natoAlpha[ch] 
    else 
    return x 
} 

//B 
var wordToNato1 = function(str) { 
    var s = "" 
    for (var i = 0; i <= str.length; i++) { 
    s + ltrToNato(i) 
    } 
} 

有了第一个功能,我想采取任何字母或数字,返回其北约形式。所以"A"将是Alpha"9"将是Niner等等。 ltrToNato函数将非常好。没问题。

随着第二个功能,我希望能够采取一个字符串和每个字符做同样的事情。例如,wordToNato("ABC123")将是"Alpha Bravo Charlie One Two Three"。这是出现问题的地方。每次我尝试在控制台通过调用wordToNato运行此它带来的错误信息

ch.match不是一个函数

所以我不知道是怎么回事错误...请帮助

+0

你永远不会调用'ch.match',其中该错误信息是从哪里来的?另外,你正在做'x = x.match(/ [0-9]/g)',这有点奇怪。你确定你想做任务还是你想要做比较? – vlaz

回答

0

通行证在字符的位置,循环索引的不是值:

s + ltrToNato(str.charAt(i)) 

此外,你的循环会经过电子nd的字符串。您应该使用的<代替<=

for (var i = 0; i < str.length; i++) { 

你的程序似乎有很多其他错误,但这种回答了这个具体的问题。

0

一对夫妇的变化:

  1. 要回答你的问题,调用ltrToNato正在传递一个整数 - 的值。该指数在使用的字符,而不是指数,并添加来自ltrToNato返回累积器变量小号值(使用+=运营商简化串联):

    s += ltrToNato(str[i]);

    你可以也可以使用charAt()而不是象数组一样索引到字符串中。

  2. 循环应通过长度为0不迭代,由于开始要么使中间表达式去一个小于长度i <= str.length-1或使用小于比较:i < str.length

    而不是使用声明,你可以在海峡调用Array.prototype.reduce

    return Array.prototype.reduce.call(str,function(returnVal,character) { return returnVal + ltrToNato(character); });

    这样,你就不必担心对循环簿记。阅读更多关于函数式编程的内容here

  3. 回报在wordToNato1末增加无功小号后的字符串:

    return s;

  4. x.match()支票将返回一个数组或为空,所以你的条件表达式else if (x = x.match(/[0-9]/g))的值match()分配给x,用新值覆盖它,其可以用于最后的其他块(即return x)。

看到这些变化在下面的示例应用:

var ltrToNato = function(ch) { 
 
    var x = ch 
 
    var nato = 
 
    ('{"A": "Alpha", "B": "Bravo", "C": "Charlie", "D": "Delta", "E": "Echo", "F": "Foxtrot", "G": "Golf", "H": "Hotel", "I": "India", "J": "Juliet", "K": "Kilo",\ 
 
    "L": "Lima", "M": "Mike", "N": "November", "O": "Oscar", "P": "Papa", "Q": "Quebec", "R": "Romeo", "S": "Sierra", "T": "Tango", "U": "Uniform", "V": "Victor",\ 
 
    "W": "Whiskey", "X": "X-Ray", "Y": "Yankee", "Z": "Zulu", "0" : "Zero", "1" : "One", "2" : "Two", "3" : "Three", "4" : "Four", "5" : "Five", "6" : "Six",\ 
 
    "7" : "Seven", "8" : "Eight", "9" : "Niner"}') 
 
    var natoLower = nato.toLowerCase() 
 
    var natoAlpha = JSON.parse(nato) 
 
    var natoAlphaLower = JSON.parse(natoLower) 
 
    if (ch >= "A" && ch <= "Z") 
 
    return natoAlpha[ch] 
 
    else if (ch >= "a" && ch <= "z") 
 
    return (natoAlphaLower[ch]) 
 
    else if (x.match(/[0-9]/g)) 
 
    return natoAlpha[ch] 
 
    else 
 
    return x 
 
} 
 

 
//B 
 
var wordToNato1 = function(str) { 
 
    var s = "" 
 
    for (var i = 0; i <= str.length-1; i++) { 
 
    s += ltrToNato(str[i]) 
 
    } 
 
    return s; 
 
} 
 
console.log('nato: '+wordToNato1("ABC123"));

1

我在这里失去了一些东西?

你想通过你的映射文字将字母转换为字符串。

所以,只需将输入分割为字符即可。然后将它们映射到您的单词并将所有单词连接在一起。

var MAP ={A:"Alpha",B:"Bravo",C:"Charlie",D:"Delta",E:"Echo",F:"Foxtrot",G:"Golf",H:"Hotel",I:"India",J:"Juliet",K:"Kilo",L:"Lima",M:"Mike",N:"November",O:"Oscar",P:"Papa",Q:"Quebec",R:"Romeo",S:"Sierra",T:"Tango",U:"Uniform",V:"Victor",W:"Whiskey",X:"X-Ray",Y:"Yankee",Z:"Zulu",0:"Zero",1:"One",2:"Two",3:"Three",4:"Four",5:"Five",6:"Six",7:"Seven",8:"Eight",9:"Niner"}; 
 

 

 
function strToNato(str){ 
 
    return str.toUpperCase().split('').map(l => MAP[l] || l).join(' '); 
 
} 
 

 
console.log(strToNato('ABC123'));