簡體   English   中英

可以縮短此代碼嗎?

[英]Can this code be shortened?

這是一個公式,用於檢查3個元素中的1個是否具有值。 如果是,則所有元素必須具有一個值:

if(   (a!='' || b!='' || c!='')   &&   (a=='' || b=='' || c=='')   )
    alert('Please fill all elements');

您可以使用模運算符,也使它成為4、5或更多變量的解決方案-只需修改最終數字即可:

if ((!a+!b+!c)%3) 

! (布爾否定)使!a為布爾結果,這是基於以下事實:空字符串是虛假的,而非空字符串是真實的,因此在這兩種情況下,您分別得到truefalse

加起來時,布爾值被強制為數字(0或1)。 所以總和是0、1、2或3。

%運算符給出除以3的余數,對於3的可能值,它是原始值, 3 除外 ;在這種情況下,結果為0。因此,對於且僅對於以下情況,我們得到非零值想要顯示驗證錯誤。

if條件的情況下,此值被強制為布爾值,並且非零數值是真實的。

動態輸入數

如果您有輸入數組,那么可以將類似的模式與filter

// Assume arr = [a,b,c];
if ( arr.filter(Boolean).length%arr.length )

請注意, Boolean函數在本質上與雙重否定法是一樣的(實際上,如果我早先使用!!而不是! ,它將是相同的-現在它提供了相反的布爾值,但這僅適用於以及)。

事后思考

盡管這回答了您的問題,但您應該真正問自己:減少這么多代碼是否值得:可讀代碼比短代碼更為重要,當然,這不受執行時間的影響。

對於3個變量,這似乎並不短,但對於更大的變量,它肯定是更短的:

 let a = "test", b = "", c = ""; let arr = [a, b, c] let filteredArr = arr.filter(item => item === '') if (filteredArr.length > 0 && filteredArr.length < arr.length) { alert('Please fill all elements'); } 

你可以做

if([a,b,c].find(entry => entry == '').length && [a,b,c].find(entry => entry !== '').length) {
     alert('Please fill all elements');
}

IMO也更具可讀性,它首先檢查是否有空,如果有,則檢查是否有數據,如果兩者都為真,則要求填充所有元素

 if(!( !!a === !!b && !!b === !!c))

那應該做。 基本上,如果所有三個條件都是真實的或虛假的,則此操作將失敗。

因此,某些元素為空,但並非所有元素都為空?

const emptyCount = (a=='') + (b=='') + (c=='');
if (emptyCount > 0 && emptyCount != 3) {
    alert('Please fill all elements');
}

你為什么不喜歡

if (a === "" || b === "" || c === ""){
  alert('Please fill all elements');
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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