簡體   English   中英

如果不是,則為javascript(否則為否)

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM