if语句问题中的OR逻辑。

时间:2013-04-26 01:31:42

标签: javascript if-statement logic

我的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");

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

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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);

答案 2 :(得分:1)

在您的代码中,您将string.charAt(i)与评估为"a" || "e" || "i" || "o" || "u"的{​​{1}}进行比较。

你要做的是:

true

在英语中我们说:string.charAt(i) === "a" || string.charAt(i) === "e" || string.charAt(i) === "i" || string.charAt(i) === "o" || string.charAt(i) === "u" 但在javascript(以及大多数其他语言)中我们说:if my string is equal to 'a' or 'e' or 'i' ..

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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()部分。

修改

亚历克斯让我再次思考。要按顺序返回元音数组:

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('');
}