有什么方法可以使下面的陳述句更簡單 -
if (data1 && data2 && data3) { return 'A'; }
if (!data1 && data2 && data3) { return 'B'; }
if (!data1 && !data2 && data3) { return 'C'; }
uj5u.com熱心網友回復:
您可以嵌套它們以組合常見條件。
if (data1) {
if (data2 && data3) {
return 'A';
}
} else {
if (data3) {
if (data2) {
return 'B';
} else {
return 'C';
}
}
}
這是否“更簡單”是個人品味的問題。
uj5u.com熱心網友回復:
我傾向于使用查找表而不是嵌套的 if/then else 陳述句,因為它通常看起來資料結構比代碼中的實際邏輯行更易于維護和擴展。該表可根據您的需要進行擴展。
對于三個布林值,有 2^3 = 8 種可能的排列。如果您只想考慮問題中的特定 3 個排列,您可以使用稀疏查找表和一點數學來計算查找索引。查找表中的值以外的值undefined將從查找中回傳:
// Values to test for:
// true, true, true - 111
// false, true, true - 11
// false, false, true - 1
const table = {
"111": 'A',
"11": 'B',
"1": 'C'
}
const data1 = false;
const data2 = true;
const data3 = true;
const lookupIndex = (!!data1 * 100) (!!data2 * 10) (!!data3);
console.log(table[lookupIndex]);
完全沒有if/else邏輯。只是一個計算和一個表查找。
注意 將!!值強制轉換為布林值,以防它們不是布林值,然后*運算子會將它們轉換為0or 1。
另外,請注意,如果您開始尋找所有可能的 8 個排列,或者如果您有更多的變數要添加到組合中,則此處的代碼節省會顯著增加。
這將轉換為十進制,將每個布林值加權為 10 的冪(data1是 10^2,data2是 10^1,data3是 10^0)。它可以轉換為二進制,將每個布林值作為 2 的冪進行加權,但對于如此少量的專案,十進制似乎更容易。
或者,這里有一個版本,您實際上將布林值保留在我認為我更喜歡的表中:
const table = {
"true,true,true": 'A',
"false,true,true": 'B',
"false,false,true": 'C'
}
const data1 = "";
const data2 = "hello";
const data3 = true;
const lookupIndex = `${!!data1},${!!data2},${!!data3}`;
console.log(table[lookupIndex]);
如果您想考慮所有 8 種可能性,甚至可能想擴展以在查找表中包含其他非布林值,您可以使用完整且可擴展的查找表。此表可擴展為布林值以外的值(如果洗掉!!布爾強制,則可以使用字串或數字:
const table = {
true: {
true: {
true: 'A',
false: 'true/true/false'
},
false: {
true: 'true/false/true',
false: 'true/false/false'
}
},
false: {
true: {
true: 'B',
false: 'false/true/false'
},
false: {
true: 'C',
false: 'true/false/false'
}
}
}
const data1 = false;
const data2 = true;
const data3 = true;
console.log(table[!!data1][!!data2][!!data3]);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/394569.html
