我需要了解這個陳述在 sintaxis/結構方面的含義:
defaultValue: (closureData != undefined) ? (closureColl[i]) ? [closureColl[i].collaboratorGroup "--" closureColl[i].collaboratorArea] : (areaFixedValue) ? [areaFixedValue] : (areaDefaultValue) ? [areaDefaultValue] : [] : []
我習慣跟隨sintaxis (condition) ? 'if true' : 'if false'
兩個“?”是什么意思?連續是什么意思?
uj5u.com熱心網友回復:
它們是嵌套的三元條件運算子。以這種方式嵌套三元組通常被認為是非常糟糕的做法,因為您遇到的原因是它們變得非常難以理解。您可以通過適當的縮進和括號使用來提高可讀性,但該行甚至沒有。
考慮一下你是否只有一個三元組:
const foo = isBarTrue ? trueValue : falseValue;
但是考慮一下 if trueValueare 本身,一個三元運算式,因為您可以任意嵌套運算式:
const foo = isBarTrue ? (isBazTrue ? truestValue : trueValue) : falseValue;
如果您洗掉括號,它會更加混亂到不可讀的程度:
const foo = isBarTrue ? isBazTrue ? truestValue : trueValue : falseValue;
一種有助于提高可讀性的約定是像這樣縮進三元組(有一些方便的 eslint 和更漂亮的插件會自動為您執行此操作,這很好)。基本上,每個?都會形成一個新的嵌套級別,由縮進線表示,而:符號“關閉”該級別的嵌套并將下一行移到最后一個 unmatched 的縮進級別?。起初有點令人困惑,但在這里它正在發揮作用:
const foo = isBarTrue
? isBazTrue
? truestValue
: trueValue
: falseValue;
您給定的運算式比我的示例更糟糕,看起來像四個嵌套的三元條件運算子(您可以計算?s 的數量),這太糟糕了。我很快會回來編輯這篇文章,看看我是否可以幫助你解開它。
編輯:為了解決這個問題,一種方法是重構并提取每個具有“a ? b : c”形式的單獨的三元組,而沒有像“x : y : z”這樣的奇怪雙精度數。嘗試拉出一旦拉出似乎就有意義的三元組 - 有時從運算式的每個“結束”開始并交替拉出單個運算式會很有幫助。此外,用上面的縮進樣式重寫它會很有幫助。
如果我們從這個開始:
const defaultValue = (closureData != undefined) ? (closureColl[i]) ? [closureColl[i].collaboratorGroup "--" closureColl[i].collaboratorArea] : (areaFixedValue) ? [areaFixedValue] : (areaDefaultValue) ? [areaDefaultValue] : [] : [];
嘗試用縮進樣式重寫它:
const defaultValue = (closureData != undefined)
? (closureColl[i])
? [closureColl[i].collaboratorGroup "--" closureColl[i].collaboratorArea]
: (areaFixedValue)
? [areaFixedValue]
: (areaDefaultValue)
? [areaDefaultValue]
: []
: [];
Now we can rewrite it as such, pulling out the last "full" ternary which kind of makes sense on its own, (areaDefaultValue) ? [areaDefaultValue] : []. Remember to replace the expression in the original ternary with the new equivalent value:
const conditionalAreaDefaultValue = (areaDefaultValue)
? [areaDefaultValue]
: [];
const defaultValue = (closureData != undefined)
? (closureColl[i])
? [closureColl[i].collaboratorGroup "--" closureColl[i].collaboratorArea]
: (areaFixedValue)
? [areaFixedValue]
: conditionalAreaDefaultValue
: [];
Then, pull out the first "full" ternary, which also sorta makes sense on its own, (closureColl[i]) ? [closureColl[i].collaboratorGroup "--" closureColl[i].collaboratorArea] : (areaFixedValue):
const conditionalAreaDefaultValue = (areaDefaultValue)
? [areaDefaultValue]
: [];
const conditionalCollValue = (closureColl[i])
? [closureColl[i].collaboratorGroup "--" closureColl[i].collaboratorArea]
: (areaFixedValue);
const defaultValue = (closureData != undefined)
? conditionalCollValue
? [areaFixedValue]
: conditionalAreaDefaultValue
: [];
From here the remaining nested ternaries are a bit easier to understand, and it looks like the middle part is doing a lot of work to determine the "final" value of this expression. Let's pull that part out, conditionalCollValue ? [areaFixedValue] : conditionalAreaDefaultValue:
const conditionalAreaDefaultValue = (areaDefaultValue)
? [areaDefaultValue]
: [];
const conditionalCollValue = (closureColl[i])
? [closureColl[i].collaboratorGroup "--" closureColl[i].collaboratorArea]
: (areaFixedValue);
const conditionalFinalValue = conditionalCollValue
? [areaFixedValue]
: conditionalAreaDefaultValue;
const defaultValue = (closureData != undefined)
? conditionalFinalValue
: [];
There is even more refactoring you could do here, especially with naming or converting things to if statements, but I will leave that to you. Hopefully this exercise sheds some light on what the heck is going on with that expression in the first place.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/445425.html
下一篇:來自外部資料庫的資料驗證
