【问题标题】:OR Logic in if statement issue.或 if 语句问题中的逻辑。
【发布时间】:2013-04-26 01:31:41
【问题描述】:

我的 if 语句中的逻辑有问题。我试图让它检查字符串字符是否等于 a、e、i、o 或 u。然后如果是这样,将字符添加到短语字符串中。否则将“x”添加到短语字符串。

if 语句似乎忽略了我的 OR 逻辑,无论它是不是元音,都返回 true。

function translate(string){
    var phrase = "";

    for(i=0; i<string.length; i++){
        if (string.charAt(i) === "a" || "e" || "i" || "o" || "u"){
           phrase += string.charAt(i);

       }else{

            console.log("x");

         }
    }
    console.log(phrase);
}


translate("this is fun");

任何帮助将不胜感激!谢谢。

【问题讨论】:

  • 我认为您应该在循环的每次迭代中将“i”推入一个数组

标签: javascript if-statement logic


【解决方案1】:
if (string.charAt(i) === "a" || "e" || "i" || "o" || "u"){

这是不正确的。如果第一个条件失败(字符不是"a"),它将始终是truthy,因为它将评估"e",这是truthy(JavaScript 返回最后一个在条件中计算表达式的一部分)。

你可以使用...

// Define them somewhere out of the loop.
var vowels = ["a", "e", "i", "o", "u"];

// Your new condition.
if (vowels.indexOf(string.charAt(i)) > -1) {

您也可以重写整个内容,例如...

var vowels = ["a", "e", "i", "o", "u"];
var phrase = string
              .split("")
              .filter(function(char) { return vowels.indexOf(char) > -1; })
              .join("");

jsFiddle.

【讨论】:

    【解决方案2】:

    您需要分别检查每个条件。例如:

    if (string.charAt(i) === "a" || string.charAt(i) === "e" || ...);
    

    要减少代码膨胀,您可以设置一个变量:

    var char = string.charAt(i);
    
    if (char === "a" || char === "e" || ...);
    

    或者你可以使用这个indexOf技巧:

    if (["a", "e", "i", "o", "u"].indexOf(string.charAt(i)) > -1);
    

    【讨论】:

      【解决方案3】:

      在您的代码中,您将string.charAt(i)"a" || "e" || "i" || "o" || "u" 进行比较,结果为true

      你们男人要做的是:

      string.charAt(i) === "a" || string.charAt(i) === "e" 
      || string.charAt(i) === "i" || string.charAt(i) === "o" || string.charAt(i) === "u"
      

      在英语中我们说:if my string is equal to 'a' or 'e' or 'i' ..,但在 javascript(和大多数其他语言)中,我们说:if my string is equal to 'a' or my string is equal to 'b' ..

      【讨论】:

        【解决方案4】:

        这样做。字符串上的.indexOf() 比数组上的.indexOf() 更广泛。

        if ("aeiou".indexOf(string.charAt(i)) > -1) {
        

        【讨论】:

          【解决方案5】:

          Alex 的回答非常好,但不是使用 indexOf 和一个数组(注意 Array.prototype.indexOf 是 ES5,所以旧版浏览器不支持),你可以使用对象代替:

          var vowels = {a:'a', e:'e', i:'i', o:'o', u:'u'};
          
          if (vowels.hasOwnProperty(string.charAt(i).toLowerCase())) {
              phrase += string.charAt(i);
          } else {
              ...
          }
          

          上面的也是不区分大小写的,所以 A, E, I, O 和 U 也会被添加到字符串中。如果您希望它区分大小写,请删除 .toLowerCase() 部分。

          编辑

          Alex 让我再次思考。要按顺序返回一个仅包含元音的数组:

          function getVowels(s) {
            return s.match(/[aeiou]/g);
          }
          

          返回一个字符串,其中所有非元音(辅音)都替换为“x”:

          function replaceConsonants(s) {
            return s.replace(/[^aeiou]/g,'x');
          }
          

          返回一个只有元音的字符串:

          function replaceConsonants(s) {
            return s.replace(/[^aeiou]/g,'');
          }
          

          function getVowels(s) {
            return s.match(/[aeiou]/g).join('');
          }
          

          等等

          【讨论】:

          • 一次性使用 split、filter、indexOf 和 join 似乎有点过分。 ;-) 正则表达式和 match 似乎也是候选者。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-29
          • 1970-01-01
          相关资源
          最近更新 更多