[英]javascript if if else (not else if)
我有一段简单的代码可以检查某些条件,并且我希望每个条件都导致唯一的输出,但是如果不满足任何条件,则导致另一个唯一的输出。
有什么方法可以创建仅在所有先前的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"); }
我可以看到的唯一其他方法是为每个函数设置一个不同的布尔值,然后对其进行测试。
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")
}
不过,这可能不是很大的改进。
如果可以使用数组,请尝试以下操作:
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提到的。
为了达到这种规模,您将需要将数据结构更改为可以迭代的结构。 这样,您的处理逻辑将保持不变,并且您可以提供任何大小的输入。 这是一个实现,其中我使用一个对象,该对象的属性表示您的布尔值。 下面的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
函数始终保持不变。
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");
}
这不是超级可读的,但这可以工作:
var boolean1 = true, boolean2 = true, boolean3 = false; [(boolean1 && !alert("boolean1")), (boolean2 && !alert("boolean2")), (boolean3 && !alert("boolean3"))] .some(function(passed) { return passed; }) || alert("none");
您可以维护一个标志,该标志在通过条件时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");
}
不,没有。 只需想象一下代码的控制流程图,就无法将其转换为结构化程序 (甚至是非结构化程序 ),而无需在多个位置评估布尔值或不引入辅助变量。
如果您只想检查每个条件一次(在执行中,不是在代码中),则可以执行
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");
您可以使用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");
}
如果您可以将它们另存为数组,则可以使用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)) : '';
});
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.