【问题标题】:Don't understand why replace() method is not working as expected不明白为什么 replace() 方法没有按预期工作
【发布时间】:2017-03-29 02:59:52
【问题描述】:

解决以下问题:

创建一个名为alienLanguage 的函数,其中输入为str,输出应将除每个单词的最后一个字母外的所有字母大写

alienLanguage("My name is John") 应该返回 "My NAMe Is JOHn"

这是我写的代码:

function alienLanguage(str){
  var words = str.toUpperCase().split(' ').map(function (a) {
    return a.replace(a[a.length - 1], a[a.length - 1].toLowerCase())
  });
  return words.join(' ');
}

所有示例测试用例均有效,但以下情况除外:

Expected: '\'THIs Is An EXAMPLe\'', instead got: '\'THIs Is An eXAMPLE\'' 

为什么eXAMPLE中的e变成小写了?不是所有东西都应该自动变成大写吗?

编辑:我刚刚意识到有 2 个e,第一个正在被替换。如何替换最后一个e?最后一个字符不是已经指定了吗?

【问题讨论】:

  • 你想要赋值而不是替换。
  • 问题是,示例中有两个 e - 开头和结尾 ... eagle 失败 ... edge 和 abba、otto 和 trumpet 也是如此 - 看到模式了吗?

标签: javascript replace


【解决方案1】:

最后一个字符不是已经指定了吗?

不,您只指定了要替换的字符,而不是指定位置。 replace 在字符串中搜索表达式。

如何替换最后一个 e?

根本不要使用replace。无论如何,它确实构造了一个新字符串,您可以更轻松地做到这一点:

function alienLanguage(str) {
  return str.split(' ').map(function(a) {
    return a.slice(0, -1).toUpperCase() + a.slice(-1).toLowerCase();
  }).join(' ');
}

您也可以使用replace,但可以将其与正则表达式一起使用:

function alienLanguage(str) {
  return str.toUpperCase().replace(/.\b/g, function(last) {
//                                 ^^^^^^ matches all characters before a word boundary
    return last.toLowerCase();
  });
}

【讨论】:

    【解决方案2】:

    您不需要将字符串拆分为单词。只需在您的正则表达式中使用positive lookahead assertion 将紧跟另一个字母的所有字母大写,如下所示:

    function alienLanguage(str){
        return str.replace(/(\w)(?=\w)/g, l => l.toUpperCase())
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用substring。您的 replace 替换并替换了单词中最后一个字符的第一次出现 - 绝对是您所追求的:

      function alienLanguage(str){
        var words = str.toUpperCase().split(' ').map(function (a) {
          return a.length ? a.substring(0, a.length - 2) + a[a.length - 1].toLowerCase() : a;
        });
        return words.join(' ');
      }
      

      【讨论】:

        【解决方案4】:

        正如@TatsuyukiIshi 所说,您需要更改replace() 的使用以进行常规分配。如需更多帮助,这里是您的 alienLanguage 函数的更新版本:

        function alienLanguage(str){
            return str.toUpperCase().split(' ').map(function(word) {
                return word.slice(0, -1) + word.substr(-1).toLowerCase()
            }).join(' ')
        }
        

        小提琴here


        补充说明:

        word.slice(0,-1) 返回单词减去最后一个字符。

        word.substr(-1) 将最后一个字符作为字符串返回。

        .map() 返回一个数组,所以你可以直接在结果上调用join()

        【讨论】:

          【解决方案5】:

          replace() 正在使用模式(或正则表达式)进行搜索,它会替换所有出现的位置。

          相反,您想要截断并创建一个新字符串,这在其他语言中称为赋值(但 JS 中的字符串是不可变的)。详情请见here

          【讨论】:

          • is searching using a regular expression - 不在问题的代码中
          【解决方案6】:

          试试看。

          function alienLanguage(str){
             var words = str.toUpperCase().split(' ').map(function (a) {
             return a.substr(0, a.length - 1) +a[a.length - 1].toLowerCase() + a.substr(a.length - 1 + 1);
             });
            return words.join(' ');
           }
          

          【讨论】:

            【解决方案7】:

            不用搜索字母,只需将字符串的大写部分与最后一个小写字母连接起来。

            这应该可以解决问题:

            function alienLanguage(str) {
              return str.split(' ').map(function(a) {
                return a.slice(0, -1).toUpperCase() + a.slice(-1).toLowerCase();
              }).join(' ');
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-12-21
              • 1970-01-01
              • 2023-01-05
              • 1970-01-01
              • 2014-12-24
              • 2014-08-04
              • 2021-01-03
              • 2018-11-08
              相关资源
              最近更新 更多