【问题标题】:Swap Case on javascript在javascript上交换案例
【发布时间】:2014-08-19 17:34:20
【问题描述】:

我制作了一个脚本来更改大小写,但在文本上使用它的结果是完全相同的文本,没有任何更改。有人可以解释一下吗?

var swapCase = function(letters){
    for(var i = 0; i<letters.length; i++){
        if(letters[i] === letters[i].toLowerCase()){
            letters[i] = letters[i].toUpperCase();
        }else {
            letters[i] = letters[i].toLowerCase();
        }
    }
   console.log(letters);
}

var text = 'So, today we have REALLY good day';

swapCase(text);

【问题讨论】:

  • 字符串是不可变的,所以你不能就地修改它们。您必须创建一个新字符串并返回它。
  • @DavidThomas is exactly the same text, without a single change
  • 字符串在 JS 中是不可变的。

标签: javascript


【解决方案1】:

就像伊恩说的,你需要建立一个新的字符串。

var swapCase = function(letters){
    var newLetters = "";
    for(var i = 0; i<letters.length; i++){
        if(letters[i] === letters[i].toLowerCase()){
            newLetters += letters[i].toUpperCase();
        }else {
            newLetters += letters[i].toLowerCase();
        }
    }
    console.log(newLetters);
    return newLetters;
}

var text = 'So, today we have REALLY good day';

var swappedText = swapCase(text); // "sO, TODAY WE HAVE really GOOD DAY"

【讨论】:

  • 谢谢你们提供的信息,我不知道 :)
  • 有点希望有办法在没有条件的情况下做到这一点。可惜JS没有音译功能。
【解决方案2】:

您可以使用这个简单的解决方案。

var text = 'So, today we have REALLY good day';

var ans = text.split('').map(function(c){
  return c === c.toUpperCase()
  ? c.toLowerCase()
  : c.toUpperCase()
}).join('')

console.log(ans)

使用 ES6

var text = 'So, today we have REALLY good day';

var ans = text.split('')
.map((c) =>
 c === c.toUpperCase() 
 ? c.toLowerCase()
 : c.toUpperCase()
).join('')

console.log(ans)

【讨论】:

  • 使用[...text] 而不是split()
【解决方案3】:

伙计们!获取更简单的代码:

string.replace(/\w{1}/g, function(val){
    return val === val.toLowerCase() ? val.toUpperCase() : val.toLowerCase();
});

【讨论】:

    【解决方案4】:

    这是一种使用按位异或运算符^ 的替代方法。
    我觉得这比使用toUppserCase/toLowerCase方法更优雅

    "So, today we have REALLY good day"
    .split("")
    .map((x) => /[A-z]/.test(x) ? String.fromCharCode(x.charCodeAt(0)  ^ 32) : x)
    .join("")
    

    说明
    因此,我们首先拆分数组,然后使用map 函数对每个字符执行突变,然后将数组重新连接在一起。
    在 map 函数中,RegEx 测试该值是否是字母字符:/[A-z]/.test(x) 如果是,那么我们使用 XOR 运算符 ^ 来移位。这就是反转字符大小写的原因。 charCodeAt 将 char 转换为 UTF-16 代码。 XOR (^) 运算符翻转字符。 String.fromCharCode 将代码转换回字符。 如果 RegEx 给出 false(不是 ABC 字符),则三元运算符将按原样返回字符。

    参考资料:

    【讨论】:

      【解决方案5】:

      短模式代码大战的一个衬里:

      let str = "hELLO wORLD"
      str.split("").map(l=>l==l.toLowerCase()?l.toUpperCase():l.toLowerCase()).join("")

      【讨论】:

        【解决方案6】:

        这是一个使用正则表达式的解决方案。它全局匹配每个 word-char,然后对匹配的组执行一个函数。

        function swapCase(letters) {
          return letters.replace( /\w/g, function(c) {
            if (c === c.toLowerCase()) {
              return c.toUpperCase();
            } else {
              return c.toLowerCase();
            }
          });
        }
        

        【讨论】:

          【解决方案7】:

          #this 是一个程序将大写转换为小写,反之亦然并返回字符串。

          function main(input) {
              var i=0;
              var string ='';
              var arr= [];
              while(i<input.length){
                 string = input.charAt(i);
          
                 if(string == string.toUpperCase()){
                     string = string.toLowerCase();
                     arr += string;
                  }else {
                     string = string.toUpperCase(); 
                     arr += string;
                 }
                 i++;
              }
              console.log(arr);
          }
          

          【讨论】:

          • 感谢您的回答!虽然这个答案会起作用,但它可能有助于清理一些代码(例如,if(string == string.toUpperCase()) 之前的空 if() 以使其更具可读性
          • 写错了。我清除了它。如果对您有帮助,请喜欢该解决方案。
          【解决方案8】:
          1. 拆分字符串并使用map函数交换字母大小写。
          2. 我们将从 #1 获取数组。
          3. 使用 join 函数加入数组。

          `

          let str = 'The Quick Brown Fox Jump Over A Crazy Dog'
          let swapedStrArray = str.split('').map(a => {
              return a === a.toUpperCase() ? a.toLowerCase() : a.toUpperCase()
          })
          
          //join the swapedStrArray
          swapedStrArray.join('')
          console.log('swapedStrArray', swapedStrArray.join(''))
          

          `

          【讨论】:

            【解决方案9】:

            使用地图的新解决方案

            let swappingCases = "So, today we have REALLY good day";
            
            let swapping = swappingCases.split("").map(function(ele){
            
              return ele === ele.toUpperCase()? ele.toLowerCase() : ele.toUpperCase();
              
            }).join("");
            
            console.log(swapping);

            【讨论】:

              【解决方案10】:

              作为旁注,除了已经说过的内容之外,您的原始代码只需进行一些小的修改即可工作:将字符串转换为 1 个字符的子字符串数组(使用拆分),处理此数组并将其转换回完成后转换为字符串(使用连接)。

              注意:这里的想法是强调访问字符串中的字符(不能修改)和处理子字符串数组(可以修改)之间的区别。在性能方面,Fabricator 的解决方案可能更好。

              var swapCase = function(str){
                  var letters = str.split("");
              
                  for(var i = 0; i<letters.length; i++){
                      if(letters[i] === letters[i].toLowerCase()){
                          letters[i] = letters[i].toUpperCase();
                      }else {
                          letters[i] = letters[i].toLowerCase();
                      }
                  }
                  str = letters.join("");
                  console.log(str);
              }
              
              var text = 'So, today we have REALLY good day';
              
              swapCase(text);
              

              【讨论】:

                猜你喜欢
                • 2013-10-04
                • 1970-01-01
                • 1970-01-01
                • 2012-09-28
                • 1970-01-01
                • 2016-10-09
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多