[英]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
为布尔结果,这是基于以下事实:空字符串是虚假的,而非空字符串是真实的,因此在这两种情况下,您分别得到true
或false
。
加起来时,布尔值被强制为数字(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.