【问题标题】:I am trying to move the first two letters of the string to the end if it starts with two consonants. It just returns Not a number, or NaN如果它以两个辅音开头,我试图将字符串的前两个字母移到末尾。它只返回不是数字或 NaN
【发布时间】:2017-11-13 23:51:51
【问题描述】:

这是我的 代码:

function lattify(id) {
  var inputTextStr = document.getElementById(id).value;
  var lattiStr = "";
  for (var i = 0; i < inputTextStr.length; i++) {
    console.log(inputTextStr[i]);
    var inputText = inputTextStr[i];
    if (inputTextStr[i + 1] !== "a" || "e" || "i" || "o" || "u") {
      lattiStr = inputTextStr.substr(2) +
        inputTextStr.substr(0, inputTextStr.length);
    }

  }
  console.log(lattiStr);
}

这是我的 代码:

<form>
  <input type="text" id="latin">
  <button type="button" onclick="lattify('latin'.toString())">Submit</button>
</form>

这个程序应该做的是将表单中的文本输入到函数'lattify'。那部分有效。不起作用的部分是前两个字母加到末尾的部分,如果它们都是辅音的话。

【问题讨论】:

  • 如果你提供一些“之前”和“之后”的例子会很有帮助
  • 我不认为这符合您的预期:if(inputTextStr[i+1]!=="a"||"e"||"i"||"o"||"u")。例如:inputTextStr[i+1]!=="a" 是一个布尔语句。然后语句“e”是它的 ORd,因为它是非零的,所以它总是 TRUE。所以你的if 声明总是正确的。相反,你为什么不使用indexOf
  • 另外,您在索引之前不会检查字符串的边界。你会遇到问题。
  • "如果字符串的前 2 个字符是辅音,则将它们移到字符串的末尾"。另一种解决方案:"your string here".replace(/^([^aeiou]{2}).*/,function(m0,m1){return m0.substring(2)+m1});

标签: javascript html javascript html


【解决方案1】:

对我来说,这似乎是一个正则表达式而不是循环的好地方。例如,这变得更简单:

function lattify(inputTextStr) {
  if (inputTextStr.match(/^[^aeiou]{2}/i)) {
    inputTextStr = inputTextStr.substring(2) + inputTextStr.substring(0, 2)
  }
  return inputTextStr
}

console.log(lattify("MMstring"))
console.log(lattify("MeMstring"))
console.log(lattify("eestring"))
console.log(lattify("eMstring"))

这也是不区分大小写的。

还值得注意的是,元音测试的逻辑并不能保证字符串以辅音开头。如果字符串以数字或标点符号开头,请考虑您想要的行为。

【讨论】:

    【解决方案2】:

    您没有将输入文本显式转换为 char 数组。

    来自another post,你可以这样做:

    var strChars = myString.split("");
    

    如果您在同一个循环中寻址[i][i+1],则循环需要以length - 1 结束,否则您将在最后一个循环中超出范围。

    应检查每个字母的条件:

    inputTextStr[i+1]!=="a"||
    inputTextStr[i+1]!=="e"||
    inputTextStr[i+1]!=="i"||
    inputTextStr[i+1]!=="o"||
    inputTextStr[i+1]!=="u"
    

    substr的第二个参数应该是2,就是要复制到末尾的字符数。

    inputTextStr.substr(0,2);
    

    而不是

    inputTextStr.substr(0,inputTextStr.length);
    

    【讨论】:

    • inputTextStr.substr(0,2); 当字符串不包含 2 个字符时会发生什么?
    • @MFisherKDX 它将粘贴 0 或 1 个字符,但问题中的假设是它有 2 个字符。
    【解决方案3】:

    您不能通过附加多个||s 来检查 if 语句中的多个值。每次都需要包含条件的左侧部分。

    您可以检查元音数组以避免此类冗余代码。

    array.indexOf(val) 将在array 内部检查val,如果找不到则返回-1。

    循环不是必需的,您可以手动检查第一个和第二个字符,必要时将它们移动到末尾。 substr(0, 2) 获取前两个字符,substr(2, [str.length]) 获取其他所有字符。

    function lattify(id) {
      var vowels = ['a', 'e', 'i', 'o', 'u'];
      var inputTextStr = document.getElementById(id).value;
      var lattiStr = ""; 
      var ret = inputTextStr;
    
      if(inputTextStr.length > 2 && vowels.indexOf(inputTextStr[0]) === -1 && vowels.indexOf(inputTextStr[1]) === -1) {
        //first and second characters in the string are consonants.
        ret = inputTextStr.substr(2, inputTextStr.length) + inputTextStr.substr(0,2);
      } 
    
      console.log('returning: ' + ret);
      return ret;
    }
    

    【讨论】:

    • 谢谢 IrkenInvader。真的很有帮助!
    • Np,很高兴听到!
    猜你喜欢
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多