我的JavaScript过程有点不对劲

我的JavaScript过程有点不对劲,javascript,html,Javascript,Html,作为我正在创建的拼写检查算法的一部分,我编写了一个函数,该函数返回一个数组,其中包含从给定单词中替换1个字母的所有单词。字母替换必须在键盘上距离1;因此,我制作了以下地图 var kdmap = {'a': ['q','w','s','z'], 'b': ['v','g','h','n'], 'c': ['x','d','f','v'], 'd': ['s','e','r','f','

作为我正在创建的拼写检查算法的一部分,我编写了一个函数,该函数返回一个数组,其中包含从给定单词中替换1个字母的所有单词。字母替换必须在键盘上距离1;因此,我制作了以下地图

     var kdmap = {'a': ['q','w','s','z'],
                 'b': ['v','g','h','n'],
                 'c': ['x','d','f','v'],
                 'd': ['s','e','r','f','c','x'],
                 'e': ['w','s','d','r'],
                 'f': ['d','r','t','g','v','c'],
                 'g': ['f','t','y','h','b','v'],
                 'h': ['g','y','u','j','n','b'],
                 'i': ['u','h','j','i'],
                 'j': ['h','n','m','k','i','u','y'],
                 'k': ['j','i','o','l','m'],
                 'l': ['k','o','p'],
                 'm': ['n','j','k'],
                 'n': ['b','h','j','m'],
                 'o': ['i','k','l','p'],
                 'p': ['o','l'],
                 'q': ['a','w'],
                 'r': ['e','d','f','t'],
                 's': ['a','w','e','d','x','z'],
                 't': ['r','f','g','y'],
                 'u': ['y','h','j','i'],
                 'v': ['c','f','g','b'],
                 'w': ['q','a','s','e'],
                 'x': ['z','s','d','c'],
                 'y': ['t','g','h','u'],
                 'z': ['a','s','x']
                };
在以下函数中使用

    function letter_replacements(w)
    {
        /* Given a word w, return an array of all strings that are w
           with 1 letter replaced, that letter being one which is distance
           1 away on the keyboard
        */
        var A = new Array();
        for (var i = 0, j = w.length; i < j; ++i)
        {
            var thisChar = w[i];
            var closeChars = kdmap[thischar];
            for (var k = 0, n = closeChars.length; k < n; ++k)
                A.push(w.slice(0,i)+closeChars[k]+w.slice(i+1,j))
        }
        return A;
    }
功能字母的替换(w)
{
/*给定一个单词w,返回一个包含所有w字符串的数组
替换1个字母,该字母表示距离
在键盘上输入1
*/
var A=新数组();
对于(变量i=0,j=w.length;i
当我运行包含该代码的页面时,我的浏览器JavaScript控制台上没有错误。然而,当我创建一个小提琴来测试函数时,我没有得到任何输出

这是我的小提琴:


知道我做错了什么吗?

也许你需要写一个程序来检查这个案例;)

查看控制台,您会看到错误:
uncaughtreferenceerror:thischar未定义

看看你搞乱的代码

var thisChar = w[i];
       ^^^
var closeChars = kdmap[thischar];
                           ^^^

在我看来,这两行代码似乎有问题:

 var thisChar = w[i];
 var closeChars = kdmap[thischar];
必须是:

 var thisChar = w[i];
 var closeChars = kdmap[thisChar.toLowerCase()];
 if (closeChars === undefined)
    continue;
1) 你的外壳脱落了thisChar不是thisChar

2) 不考虑空格字符。所以closeChars可以是未定义的

3) 您必须对得到的每个字符调用toLowerCase,因为JavaScript对象中没有大写字符


我已经用一些补丁更新了你的小提琴。我将详述以下问题:

  • thisChar和thisChar不是一回事。区分大小写
  • 不能保证最终会得到closeChars数组,因此:

    var closeChars=kdmap[thisChar]| |[]

  • 您的地图仅包含小写字符,因此:

    var thisChar=w[i].toLowerCase()

  • 下面是修改后的实际代码

    var kdmap = {'a': ['q','w','s','z'],
     'b': ['v','g','h','n'],
     'c': ['x','d','f','v'],
     'd': ['s','e','r','f','c','x'],
     'e': ['w','s','d','r'],
     'f': ['d','r','t','g','v','c'],
     'g': ['f','t','y','h','b','v'],
     'h': ['g','y','u','j','n','b'],
     'i': ['u','h','j','i'],
     'j': ['h','n','m','k','i','u','y'],
     'k': ['j','i','o','l','m'],
     'l': ['k','o','p'],
     'm': ['n','j','k'],
     'n': ['b','h','j','m'],
     'o': ['i','k','l','p'],
     'p': ['o','l'],
     'q': ['a','w'],
     'r': ['e','d','f','t'],
     's': ['a','w','e','d','x','z'],
     't': ['r','f','g','y'],
     'u': ['y','h','j','i'],
     'v': ['c','f','g','b'],
     'w': ['q','a','s','e'],
     'x': ['z','s','d','c'],
     'y': ['t','g','h','u'],
     'z': ['a','s','x']
    };
    
    function letter_replacements(w) {
      /* Given a word w, return an array of all strings that are w
       with 1 letter replaced, that letter being one which is distance
       1 away on the keyboard
      */
      var A = new Array();
      for (var i = 0, j = w.length; i < j; ++i)
      {
        var thisChar = w[i].toLowerCase();
        var closeChars = kdmap[thisChar] || [];
        for (var k = 0, n = closeChars.length; k < n; ++k)
          A.push(w.slice(0,i)+closeChars[k]+w.slice(i+1,j))
      }
      return A;
    }
    
    var myWord = "Obama smokes cigarettes.";
    var myArray = letter_replacements(myWord);
    document.getElementById("mydiv").innerHTML = "<p>" + myArray.join('') + "</p>";
    
    var kdmap={'a':['q','w','s','z'],
    ‘b’:[v’、‘g’、‘h’、‘n’],
    ‘c’:[‘x’、‘d’、‘f’、‘v’],
    ‘d’:[‘s’、‘e’、‘r’、‘f’、‘c’、‘x’],
    ‘e’:[w’、‘s’、‘d’、‘r’],
    ‘f’:[‘d’、‘r’、‘t’、‘g’、‘v’、‘c’],
    ‘g’:[‘f’、‘t’、‘y’、‘h’、‘b’、‘v’],
    ‘h’:[‘g’、‘y’、‘u’、‘j’、‘n’、‘b’],
    ‘i’:[u’、‘h’、‘j’、‘i’],
    ‘j’:[‘h’、‘n’、‘m’、‘k’、‘i’、‘u’、‘y’],
    ‘k’:[‘j’、‘i’、‘o’、‘l’、‘m’],
    'l':['k','o','p'],
    'm':['n','j','k'],
    ‘n’:[‘b’、‘h’、‘j’、‘m’],
    ‘o’:[i’、‘k’、‘l’、‘p’],
    'p':['o','l'],
    “q”:[a',w'],
    'r':['e','d','f','t'],
    's':['a','w','e','d','x','z'],
    ‘t’:[‘r’、‘f’、‘g’、‘y’],
    ‘u’:[‘y’、‘h’、‘j’、‘i’],
    'v':['c','f','g','b'],
    ‘w’:[‘q’、‘a’、‘s’、‘e’],
    'x':['z','s','d','c'],
    ‘y’:[‘t’、‘g’、‘h’、‘u’],
    'z':['a','s','x']
    };
    功能字母_替换(w){
    /*给定一个单词w,返回一个包含所有w字符串的数组
    替换1个字母,该字母表示距离
    在键盘上输入1
    */
    var A=新数组();
    对于(变量i=0,j=w.length;i”;
    

    我最近看到了很多
    新数组()
    而不是
    []
    thischar
    未定义。变量名称区分大小写<代码>此字符
    !=
    thischar
    closeChars
    对于非字母字符将是未定义的。例如“导致错误”。@YuryTarabanko:没关系,因为在我的程序中定义的“单词”只由字母字符序列组成。