更改大小写,反转和镜像字符串javascript codewars kata

时间:2019-06-10 14:48:59

标签: javascript

嗨,我有这个kata问题,我目前正在解决kata的说明,如下所示:

  

-给出2个字符串参数,显示以下内容的串联:

     

-第二个字符串的反向,带有大小写倒置;例如Fish-> HSIf

     

-两个字符串之间的分隔符:@@@

     

-第一个字符串颠倒并带有大写字母,然后进行镜像;例如水->零售

我的问题是我的输出具有非字母的任何内容的重复,例如,如果我的输入为“ 123”,则返回“ 112233”,请在此处检查我认为有问题的部分代码,我需要查找一种不重复在我的结果上添加非字母的内容的方法。例如,如果我输入以下内容:console.log(mirror(“此目录为”,“给我123个ProBleMS”))。我得到了:smELbORp 332211 Em GNiVIg @@@ SIEdoCSIHttHIS CodE IS。但是我想要这个:smELbORp 321 Em GNiVIg @@@ SIEdoCSIHttHIS CodE IS

for (let i = 0; i < s1.length; i++) {
    if (s1[i] == s1[i].toUpperCase()) {
        if (s1[i])
            y += s1[i].toLowerCase();
    } 

    if (s1[i] == s1[i].toLowerCase()) {
        y += s1[i].toUpperCase();
    }
}

3 个答案:

答案 0 :(得分:0)

  

我的问题是我的输出具有非字母的任何内容的重复,例如,如果我的输入为“ 123”,则返回“ 112233”

问题在于,当您处理诸如"1"之类的非字母字符时,它始终等于toUpperCasetoLowerCase的结果,因为它们不更改这些字符:

console.log("1" == "1".toUpperCase()); // true
console.log("1" == "1".toLowerCase()); // also true

因此,您的两个if条件都成立,并且两次附加了字符。

您可能不仅要在第二个else之前使用if,而且还要在第三个块中使用字符,因为它原样保留了字符(我无法立即想到一个字符串既不等于自己的toUpperCase也不等于toLowerCase,但这并不意味着不存在)。您也不需要嵌套的if。所以:

if (s1[i] == s1[i].toUpperCase()) {
    y += s1[i].toLowerCase();
} else if (s1[i] == s1[i].toLowerCase()) {
    y += s1[i].toUpperCase();
} else {
    y += s1[i];
}

仅在else条件为假的情况下才使用if分支。


旁注:由于您使用的是ES2015 +语法(例如let),因此您可以考虑将for-of用于循环:

for (const ch of s1) {
    if (ch == ch.toUpperCase()) {
        y += ch.toLowerCase();
    } else if (ch == ch.toLowerCase()) {
        y += ch.toUpperCase();
    } else {
        y += ch;
    }
}

答案 1 :(得分:0)

如果您只想对字母进行此操作,请在应用逻辑之前使用如下检查:

  var letters = /^[A-Za-z]+$/;
   if(inputtxt.value.match(letters)){
     // do the logic here
      }
    else{
    }

答案 2 :(得分:0)

我刚刚找到了kata。这是kata link

我认为您在弄清楚如何在lowerCase和upperCase之间进行转换(反之亦然)时遇到了一些麻烦。您可以按照以下说明进行操作。

  1. 检查字符是否小写。如果为小写,则将其变为大写
  2. 如果不是lowerCase,那么它必须是upperCase或其他形式。不管它是什么,只要将其变成小写即可。由于将除字母以外的任何内容都转换为小写字母,因此将不起作用。因此,这不会造成伤害。
  3. 我认为现在您可以处理其余的事情。

如果仍然遇到问题,则可以检查我的解决方案,并获得一些有关其工作原理的见解,但我建议您在查看解决方案之前需要尝试一下。

const changeStr = (str, reverse = false) => {
    let changedStr = str.split('').reduce((newStr, char) => {
        if(char.toLowerCase() == char) {
            return newStr += char.toUpperCase();
        } else {
            return newStr += char.toLowerCase();
        }
    }, '')
    if(reverse) changedStr = changedStr.split('').reverse().join("");
    return changedStr;
}
const concat = (str1, str2) => {
    return `${changeStr(str2, true)}@@@${changeStr(str1, true)}${changeStr(str1)}`; 
}

console.log(concat('FizZ', 'buZZ')) // zzUB@@@zZIffIZz