JavaScript的if if else语句(不包括else if)。

4
我有一段简单的代码,检查了一些条件,我希望每个条件都能产生唯一的输出,但如果没有满足条件的情况,则产生另一个唯一的输出。
是否有办法创建一个仅在所有先前的if语句失败时触发的else?我知道下面的代码执行相同的目的,但它似乎很笨重,而且最好有一种更快速的方法来检查所有变量,而不是将它们全部复制粘贴到另一个if语句中。

var boolean1 = true,
  boolean2 = true,
  boolean3 = false;

if (boolean1) {
  alert("boolean1");
}
if (boolean2) {
  alert("boolean2");
}
if (boolean3) {
  alert("boolean3");
}
/* and so on */
if (!boolean1 && !boolean2 && !boolean3 /* etc */ ) {
  alert("none");
}


3
使用 switch 语句并带有 default 分支。详见switch - zero298
2
如果布尔值能以数组的形式存在,那可能会更容易些,这种情况可行吗? - Nils
1
@zero298 — 不:查找与输入表达式结果相同的第一个case子句。如果boolean1为true,则不会检查boolean2情况。 - Quentin
@zero298 我的理解是 switch case 根据一个表达式的结果进行评估。这个问题涉及到许多布尔变量,使用 switch case 可能吗? - Thangadurai
这里的被接受答案提供了一个解决这个问题的快捷方式:https://dev59.com/xHA75IYBdhLWcg3wH1NB - Thangadurai
显示剩余2条评论
9个回答

1
如果可能的话,尝试使用数组:

var booleans = [false, false, false];
var i = 0;
while (i < booleans.length) {
    if (booleans[i] === true) {
        alert("boolean"+i);
    }
    i++;
}
i = 0;
while (booleans[i] === false && i < booleans.length) {
    i++;
}
if (i == booleans.length) {
    alert('none');
}

// Filter would work like this:
var bools = booleans.filter(function (val, ind) { return !val; });
if (bools.length  > 0) alert('none');

您可以在此处阅读有关filter()的更多信息:https://msdn.microsoft.com/de-de/library/ff679973(v=vs.94).aspx

另一种可能性是使用.every(),就像@Bergi提到的那样。


如果您的 JavaScript 版本支持,也可以使用数组函数(例如 filter),但我在这里没有展示。 - Nils
你能解释一下你提到的过滤函数吗?我不太确定你的意思是什么。 - Philip Eagles

1
我能想到的另一种方法是每个函数设置一个不同的布尔值,然后进行测试。
var boolean1 = true,
    boolean2 = true,
    boolean3 = false,
    any = false;


if (boolean1) {
  alert("boolean1");
  any = true;
}
if (boolean2) {
  alert("boolean2");
  any = true;
}
if (boolean3) {
  alert("boolean3");
  any = true;
}
/* and so on */
if (!any) {
  alert("none")
}

这可能并不是很大的改进。

1
为了实现这个比例尺,您需要将数据结构更改为可迭代的内容。这样,您的处理逻辑保持不变,并且可以提供任何大小的输入。以下是一个实现方式,其中我使用具有属性表示布尔值的对象。下面的checkResults函数遍历对象中的属性名称,检查每个属性的值,并在任何一个值为true时执行警报并设置标志。最后,它检查是否有任何值为true,并以该情况进行警报。

function checkResults(resultMap) {
    var any = false;
    Object.keys(resultMap).forEach(function(key) {
        if (resultMap[key] === true) {
          any = true;
          alert(key);
        }
    });
    if (!any)
      alert('none');
}

checkResults({
  'boolean1': false,
  'boolean2': true,
  'boolean3': false
});

如果必要,您可以逐个属性地构建输入对象:

var results = {};
results['boolean1'] = true;
results['boolean2'] = false;
...
checkResults(results);

checkResults函数始终保持不变。


接受这个答案,因为这是我见过的最紧凑的方法。顺便说一下,添加第二个“object”,为每个结果存储一个字符串(例如,“alert('boolean1')”),然后使用“eval(“script string goes here”)”调用它,可以使其与其他代码块兼容。 - Philip Eagles
1
@PhilipEagles:没错,但是根本不需要使用eval或者第二个对象——实际上,如果你发现自己在使用eval,那么就意味着你需要去除一些不必要的东西。你可以将其改为使用一个包含你的“规则”的对象数组:[{ name: 'boolean1', value: true, message : function() { alert('boolean1 was bad!'); }, ...]。然后,你可以调整函数以循环遍历数组对象并调用存储在其中的message函数。 - Cᴏʀʏ

0

这不是非常易读,但这可以工作:

var boolean1 = true,
    boolean2 = true,
    boolean3 = false;

[(boolean1 && !alert("boolean1")),
    (boolean2 && !alert("boolean2")),
      (boolean3 && !alert("boolean3"))]
      .some(function(passed) {
        return passed;
      }) || alert("none");


实际上这并不起作用,因为alert总是返回undefined - Bergi

0
var accumulated = false;

acumulated = acumulated || boolean1;
if (boolean1) {
  alert("boolean1");
}

acumulated = acumulated || boolean2;
if (boolean2) {
  alert("boolean2");
}

acumulated = acumulated || boolean3;
if (boolean3) {
  alert("boolean3");
}

if(!acumulated) {
  alert("none");
}

0
你可以维护一个标志,当它满足条件时,警报将会被设置成none
var boolean1 = true;
var boolean2 = true;
var boolean3 = false;
var allConditionFailed = true;

if (boolean1) {
  alert("boolean1");
  allConditionFailed = false;
}
if (boolean2) {
  alert("boolean2");
  allConditionFailed = false;
}
if (boolean3) {
  alert("boolean3");
  allConditionFailed = false;
}

if(allConditionFailed) {
   alert("none");
}

0

没有,实际上是没有的。想象一下你代码的控制流程图,没有办法将其转换为结构化程序(甚至是非结构化程序),而不在多个位置评估布尔值或引入辅助变量。

如果您想仅在执行中检查每个条件一次(我指的是执行中,而不是代码中),可以这样做:

if (boolean1) {
  alert("boolean1");
  if (boolean2) {
    alert("boolean2");
  }
  if (boolean3) {
    alert("boolean3");
  }
} else {
  if (boolean2) {
    alert("boolean2");
    if (boolean3) {
      alert("boolean3");
    }
  } else {
    if (boolean3) {
      alert("boolean3");
    } else {
      alert("none")
    }
  }
}

但那可能比你原来的解决方案更丑陋。

我猜想你实际上想要的是一个选项数组:

var booleans = [true, true, false];
var alerts = ["boolean1", "boolean2", "boolean3"];
for (var i=0; i<booleans.length; i++)
  if (booleans[i])
    alert(alerts[i]);
if (booleans.every(b => !b))
  alert("none");

0
你可以使用for循环来减少代码的大小。
var boolean1 = true,
  boolean2 = true,
  boolean3 = false;
  none=true;
for(i=1;i<4;i++){
    var variable=window["boolean"+i];
    if (variable) {
      alert("boolean"+i);
      none=false;
    }
}

if (none) {
  alert("none");
}

0
如果您可以将它们保存为数组,那么您可以使用array.indexOf()来确保true不存在于数组中(所有测试都失败),如果存在,则使用array.forEach()循环遍历数组以对每个元素执行某些操作。

因此,您的代码将类似于以下内容:

// The array of conditions.
var bools = [true, true, false];

// Check if none of them are true (all fail).
if (bools.indexOf(true) === -1) {
    alert("none");
} else {
// Loop over them and do something based if the current one is true.
bools.forEach(function(b, i) {
    b ? alert("boolean" + (i + 1)) : '';
});
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接