如何迭代包含单个字符串的JavaScript数组?

如何迭代包含单个字符串的JavaScript数组?,javascript,arrays,string,ascii,transformation,Javascript,Arrays,String,Ascii,Transformation,我试图解决JavaScript中一个相对容易的实践问题。目标是创建一个名为shiftLetters()的函数,该函数执行以下操作: 将作为参数传递的字符串转换为由字符串中的单个字母组成的字符串数组 使用Array.prototype.map()方法迭代数组中的每个字符 如果字符是空格,则不应变换它 如果字符是字母数字,则应使用String.charCodeAt()向前推进一个字符(例如,F变为g,F变为g)对其进行转换 使用String.fromCharCode(),组装一个字符串,例如,“我不

我试图解决JavaScript中一个相对容易的实践问题。目标是创建一个名为
shiftLetters()
的函数,该函数执行以下操作:

  • 将作为参数传递的字符串转换为由字符串中的单个字母组成的字符串数组
  • 使用
    Array.prototype.map()
    方法迭代数组中的每个字符
  • 如果字符是空格,则不应变换它
  • 如果字符是字母数字,则应使用
    String.charCodeAt()
    向前推进一个字符(例如,F变为g,F变为g)对其进行转换
  • 使用
    String.fromCharCode()
    ,组装一个字符串,例如,“我不能说谎”被转换为“jdboopu ufmm bmjf”
  • 以下是我目前的代码:

    var shiftLetters = function(string){
      // 1. Convert string to an array of characters.
      const stringArray = string.split('');
      const mappedString = stringArray.map( (char) => {
        for (char in mappedString) {
          // TO BE DONE
        }
      });
    }
    
    const example = 'Able was I ere I saw Elba.';
    
    我发现上述代码存在以下问题,我不确定如何解决这些问题:

    • 虽然此示例中的字符串“在我看到Elba之前我就有了Able”,但它已成功转换为由单个字符组成的数组,例如
      ['A','b','l','e'…]
      string.prototype.charCodeAt()
      string.fromCharCode()
      不是数组公开的方法,不能在该上下文中使用
    • 在MDN和其他在线资源的搜索中,我无法找到任何可以引用数组中的索引并获取该元素的ASCII字符代码的可用方法
    虽然我可以看到,如果我成功地创建了一个经过转换的字符数组,那么使用``array.prototype.join()``创建一个按照上述方式转换的字符串将是一件简单的事情。我只是不知道如何达到这一点

    如果能提供任何见解,我将不胜感激。同时,我将继续我的研究。如果我找到答案,我会把它贴在这里

    提前感谢你的帮助

    真诚地


    Robert Hieger

    映射中不需要for循环:您已经在StringArray中的字符上进行了迭代。由于字符是字符串,因此可以对其使用所有字符串方法。在这种情况下,您需要
    String.fromCharCode
    String.charCodeAt

    var shiftLetters = function(string){
      // 1. Convert string to an array of characters.
      const stringArray = string.split('');
      const transformedStringArray = stringArray.map( (char) => {
        if (/[A-Za-z0-9]/.test(char)){
          return String.fromCharCode(char.charCodeAt() + 1);
        } 
        else {
          return char;
        }
      })
      return transformedStringArray.join('');
    }
    

    您可以获取字符代码,添加一个字符,然后获取新字符

    const
    shiftLetters=string=>string
    .拆分(“”)
    .map(c=>c==''| |!/[a-z\d]/i.test(c)
    C
    :String.fromCharCode(c.charCodeAt(0)+1))
    .加入(“”),
    示例=“在我看到厄尔巴岛之前我是能干的。”;
    
    log(移位器(示例))这是最简洁的,不会太难理解

    var shiftLetters = string => (
        string.split('').map( c => (
            String.fromCharCode( c.charCodeAt(0) + !!c.match(/[A-Za-z\d]/) )
        )).join("")
    );
    
    请注意,我使用的是隐式返回,因此缺少显式返回语句。这个解决方案最棘手的部分是线路

    c.charCodeAt(0) + !!c.match(/[A-Za-z\d]/)
    

    在本例中,我们检查c是否是一个纯字母数字字符,并与
    匹配。如果是,
    match
    将返回一个
    match
    对象,否则我们将得到null。然后,
    将truthy/falsey(匹配Obj与Null)值转换为布尔值。最后,在JavaScript中使用布尔运算时,false=0,true=1。因此,此语句将每个字母数字字符映射到下一个字母数字字符,并将所有其他字符映射到它们自己。

    谢谢您,Danilo,感谢您周到而迅速的回答。不幸的是,当我尝试将此函数的结果记录到控制台时。输出为未定义的
    。我将继续寻找这个问题的原因。不过,你的回答肯定让我更接近答案。你确定你没有遗漏任何退货声明吗?我用这段代码设置了一个and,得到了预期的结果。谢谢你,Nina,这个链式实现。我测试了这段代码,当然,它成功了。事实证明,唯一阻碍我的代码正确运行的是我忽略了在上面Danilo建议的正则表达式周围放置方括号。不过,我也很欣赏您所建议的链式实现的优雅和简洁。