【问题标题】:How Can I Iterate over JavaScript array containing single character strings?如何迭代包含单个字符串的 JavaScript 数组?
【发布时间】:2020-09-12 20:53:33
【问题描述】:

我正在尝试解决 JavaScript 中一个相对简单的练习问题。目标是创建一个名为shiftLetters() 的函数,该函数执行以下操作:

  1. 将作为参数传递的字符串转换为由字符串中的单个字母组成的字符串数组。
  2. 使用Array.prototype.map() 方法迭代数组中的每个单个字符。
  3. 如果字符是空格,则不应进行转换。
  4. 如果字符是字母数字,则应使用 String.charCodeAt() 将其转换为向前推进一个字符(例如,F 变为 G,f 变为 g)。
  5. 使用String.fromCharCode() 组合一个字符串,例如,将“我不能说谎”转换为“J dboopu ufmm b mjf”。

到目前为止,这是我的代码:

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 之前能够做到”)成功地转换为由单个字符组成的数组,例如['A', 'b', 'l', 'e'...]String.prototype.charCodeAt()String.fromCharCode() 不是数组公开的方法,不能在该上下文中使用。
  • 在 MDN 和其他在线资源的搜索中,我无法发现任何可以引用数组中的索引并获取该元素的 ASCII 字符代码的可用方法。

虽然我可以看到,如果我确实成功地创建了一个转换后的字符数组,那么使用 ```Array.prototype.join()` 来创建一个以上述方式转换的字符串。我只是无法弄清楚如何达到这一点。

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

提前感谢您的帮助。

此致,

罗伯特·希格

【问题讨论】:

    标签: javascript arrays string ascii transformation


    【解决方案1】:

    您可以获取字符代码,添加一个并获取新字符。

    const
        shiftLetters = string => string
            .split('')
            .map(c => c === ' ' || !/[a-z\d]/i.test(c)
                ? c
                : String.fromCharCode(c.charCodeAt(0) + 1))
            .join(''),
        example = 'Able was I ere I saw Elba.';
    
    console.log(shiftLetters(example));

    【讨论】:

    • 谢谢你,Nina,为这个链式实现。我测试了这段代码,当然,它有效。事实证明,阻止我的代码正确运行的唯一原因是我忽略了将方括号放在上面 Danilo 建议的正则表达式周围。不过,我也很欣赏您建议的链式实现的优雅和简洁。
    【解决方案2】:

    您不需要map 中的for 循环:您已经在遍历StringArray 中的字符。由于字符是字符串,因此您可以对它们使用所有字符串方法。在这种情况下,您需要 String.fromCharCodeString.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('');
    }
    

    【讨论】:

    • 感谢 Danilo 周到而迅速的回复。不幸的是,当我尝试将此函数的结果记录到控制台时。输出为undefined。我会继续寻找这个问题的原因。不过,您的回答无疑让我更接近答案。
    • 您确定您没有错过某处的退货声明吗?我设置了一个repl 并使用该代码并得到了预期的结果。
    【解决方案3】:

    这几乎是最简洁的,而且不会太难理解

    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 将返回一个 Match 对象,否则我们得到 null。然后,!! 会将真/假(匹配 Obj 与 Null)值转换为布尔值。最后,在 JavaScript 中使用布尔值进行算术运算时,false = 0 和 true = 1。因此,此语句会将每个字母数字字符映射到下一个字符,并将所有其他字符映射到它们自己。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      • 1970-01-01
      • 2018-02-14
      • 2020-06-20
      • 2015-11-29
      相关资源
      最近更新 更多