我有一些简单的代码可以检查某些条件,我希望每个条件都能产生一个唯一的输出,但是如果没有满足条件则会产生另一个独特的输出。
有没有办法创建else
只有在所有以前的if
语句都失败后才会触发?我知道下面的代码实现了相同的目的,但它似乎很麻烦,更快捷地检查所有变量比将所有变量复制并粘贴到另一个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");
}

答案 0 :(得分: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 :(得分: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');
&#13;
您可以在此处详细了解filter():https://msdn.microsoft.com/de-de/library/ff679973(v=vs.94).aspx
其他可能性使用.every()作为@Bergi提到。
答案 2 :(得分: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
函数始终保持不变。
答案 3 :(得分: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");
}
答案 4 :(得分:0)
这不是超级可读,但这可行:
var boolean1 = true,
boolean2 = true,
boolean3 = false;
[(boolean1 && !alert("boolean1")),
(boolean2 && !alert("boolean2")),
(boolean3 && !alert("boolean3"))]
.some(function(passed) {
return passed;
}) || alert("none");
&#13;
答案 5 :(得分: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");
}
答案 6 :(得分:0)
不,没有。想象一下代码的控制流程图,没有办法将其转换为structured program(甚至是非结构化的),而无需在多个位置评估布尔值或不引入辅助变量。
如果你只想检查每个条件一次(在执行中我的意思,而不是在代码中),你可以做
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");
答案 7 :(得分: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");
}
答案 8 :(得分:0)
如果你可以将它们保存为数组,那么你可以使用array.indexOf()
来确保数组中不存在true(所有测试都失败),如果它通过{{1}循环遍历数组为每个人做点什么。
所以你的代码看起来像这样:
array.forEach()