将字符串的小写字母转换为大写字母和反转字母

时间:2018-03-19 02:01:54

标签: javascript uppercase lowercase

let message = "heY, WHAt are you dOING?";
let count_changes = 0;
let isLetter = (letter) => {
    if (('a'<=letter && letter >='z') || ('A'<=letter && letter >='Z')) {
        return letter;
    } else {
        return -1;
    }
}

for(let i = 0; i <= message.length; i++) {
    if (isLetter(i) && message[i].toLowerCase()) {
        message[i].toUpperCase();
        count_changes++;
        console.log(message[i].toLowerCase());
    }
    else if (isLetter(i) && message[i].toUpperCase()) {
        message[i].toLowerCase();
        count_changes++;
    }
    else {
        console.error('Bad stirng');
    }
}

您好,我想使用函数isLetter来检查每个字符的字符串消息,当我在for循环中使用isLetter来检查if语句时是否是一个字母,以及后面的小写字母是否大写i增加count_changes ++有一个更改。再次使用第二个if语句,如果我也是Letter,在这种情况下是大写字母,那么如果更改为小写字母以增加count_changes ++,那么count_changes将成为我的最终结果 谢谢

3 个答案:

答案 0 :(得分:2)

<强> TL; DR:

let message = "heY, WHAt are you dOING?";
let newMessage = "";
let count_changes = 0;
let isLowerCaseLetter = (letter) => 'a' <= letter && letter <= 'z';
let isUpperCaseLetter = (letter) => 'A' <= letter && letter <= 'Z';

/* Iterate over every character of the message. */
for (let i = 0; i < message.length; i++) {
  /* Cache the character at the current index. */
  let character = message[i];

  /* Check whether the character is a lowercase letter. */
  if (isLowerCaseLetter(character)) {
    newMessage += character.toUpperCase();
    count_changes++;
  }

  /* Check whether the character is an uppercase letter. */
  else if (isUpperCaseLetter(character)) {
    newMessage += character.toLowerCase();
    count_changes++;
  }
  
  /* Otherwise, just add the current character to the new message. */
  else newMessage += character;
}

console.log("New Message: ", newMessage);
console.log("Changes: ", count_changes);

你的错误:

  1. 由于>='z',您检查字符是否为字母的方式是错误的。它应该是<='z'。检查'Z'

  2. 也是如此
  3. 具有布尔内涵的函数最好返回truefalse而不是-1或字符本身。

  4. isLetter内部传递索引而不是字符本身。函数调用应为isLetter(message[i])而不是isLetter(i)

  5. 由于逗号和单词之间的空格,您正在测试的消息将被视为'bad string'

  6. 在你的循环中,条件应该是i < message.length,否则,每条消息都会被视为'坏字符串',因为你将超过所有字符并得到一个undefined值。

  7. 方法toLowerCasetoUpperCase不会影响原始字符串,而是创建一个新字符串。如果要将生成的字符组合在一起,则必须初始化newMessage字符串并将每个循环连接到已处理的字符。

  8. 建议的解决方案:

    1. 而不是一个isLetter函数创建一个检查字符是否为小写字母而另一个检查是否为大写字母。通过这种方式,您可以将检查结合起来,if子句将更简单,更易读。

    2. 完全抛弃isLetter检查和好的字符串/坏字符串,以免出现空格和标点符号等中间字符问题。

    3. 尝试最小化函数调用,对于大字符串,它们会大大减慢代码的速度。在下面的代码中,与接受的答案相比,仅使用每个循环的2个函数调用

      • 每个循环加3个函数调用,
      • 当字符为字母(大部分时间)
      • 时有3个函数调用
      • 3个一次性函数调用frommapjoin,这对于大字符串很重要。
    4. <强> SPEEDTEST:

      在一系列使用大量字符串(长度为2,825,856个字符串)的5个测试中,答案如下:

      • 此答案(已使用jsFiddle[1141.91ms, 1150.93ms, 1093.75ms, 1048.50ms, 1183.03ms]

      • 接受回答(已使用jsFiddle[2211.30ms, 2985.22ms, 2136.73ms, 2279.26ms, 2482.34ms]

答案 1 :(得分:1)

根据我的理解,您希望计算字符串中的字符数并返回一个字符串,其中所有大写字符都替换为小写字符,所有小写字符都替换为大写字符。此外,您希望为每个更改的字符增加一次countChanges。

此代码应该按您的要求执行:

let message = "heY, WHAt are you dOING?";
let countChanges = 0;
let isLetter = c => c.toLowerCase() !== c.toUpperCase();
let isLowerCase = c => c.toLowerCase() === c;

let flippedMessage = Array.from(message).map((c)=>{
    if(!isLetter(c)){
        return c;
    }
    countChanges++;
    // return uppercase character if c is a lowercase char
    if(isLowerCase(c)){
        return c.toUpperCase();
    }
    // Here, we know c is an uppercase character, so return the lowercase
    return c.toLowerCase();
}).join('');

// flippedMessage is "HEy, whaT ARE YOU Doing?"
// countChanges is 18

答案 2 :(得分:1)

默认情况下,javascript对字符串的比较区分大小写,因此您可以通过将字符与大写或小写转换后的值进行比较来检查字符的大小写。

如果它是相同的,那么案例就是您检查的情况,如果不是,情况就不同了。

"TRY" == "TrY"会返回false,而"TRY" == "TRY"会返回true;

因此,使用变量来指示检查的最后一个字母的大小写,然后将下一个字母与相反的大小写进行比较。如果匹配,则案例已更改,否则情况仍然相同。

isLetter函数将值检查为单个字符,并使用正则表达式测试确保它是一个字母 - 没有标点符号或数字等。

你的循环总会产生错误,因为你在消息字符串的长度之外进行迭代 - 数组是基于0的。

let message = "heY, WHAt are you dOING?";
let count_changes = 0;
let lowerCase = message[0] == message[0].toLowerCase();
let messageLength = message.length;

function isLetter (val) {
    // Check val is a letter of the alphabet a - z ignoring case.
    return val.length == 1 && val.match(/[a-z]/i);
}

for (let i = 0; i < messageLength; i++) {
    var char = message[i];
    if (isLetter(char)) {
        if(lowerCase) {
            // Check to see if the next letter is upper case when the last one was lower case.
            if(char == char.toUpperCase()) {
                lowerCase = false;
                count_changes++;
            }
        }
        else {
            // Check to see if the next letter is lower case when the last one was upper case.
            if(char == char.toLowerCase()) {
                lowerCase = true;
                count_changes++;
            }
        }
    }
    else {
        // Found a non-letter character.
        console.error('Not a letter.');
    }
}

console.log("Number of times the case changed: " + count_changes);