[英]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.