繁体   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