Javascript 使用类似的条件规则压缩if、else JS
试图找到一种方法来浓缩这一点。我不确定做这件事的最佳方法。基本上,如果符合条件,我会显示一个带有参数的警报,该参数就是消息。我在考虑也许在功能上试试。这是更大功能组件的一部分。我也在想,如果我能找到一种方法来浓缩其他的if,我可以用三元。提前感谢您的帮助Javascript 使用类似的条件规则压缩if、else JS,javascript,if-statement,conditional-statements,Javascript,If Statement,Conditional Statements,试图找到一种方法来浓缩这一点。我不确定做这件事的最佳方法。基本上,如果符合条件,我会显示一个带有参数的警报,该参数就是消息。我在考虑也许在功能上试试。这是更大功能组件的一部分。我也在想,如果我能找到一种方法来浓缩其他的if,我可以用三元。提前感谢您的帮助 const handleUpdatePassword = () => { const allFilled = !reject(passwords).length; const passwordsMatch = newPassword ==
const handleUpdatePassword = () => {
const allFilled = !reject(passwords).length;
const passwordsMatch = newPassword === conPassword;
const isDifferent = curPassword !== newPassword;
const meetsPasswordRequirements = validatePassword();
const usesName = isUsingName();
const usesUserID = isPartOfUserID();
const isValidPassword = meetsPasswordRequirements && isDifferent;
if (allFilled) {
if (!isDifferent) {
Alert.alert(difPassWord);
} else if (!passwordsMatch) {
Alert.alert(noMatch);
} else if (!meetsPasswordRequirements) {
Alert.alert(pasReqs);
} else if (usesName || usesUserID) {
Alert.alert(pasName);
}
} else {
Alert.alert(fieldNotComplete);
}
if (isValidPassword) {
changePasswordPost(
{
userId,
curPassword,
newPassword
},
partyId
);
}
}) 您可以为验证规则创建一个对象数组,每个对象都包含一个函数,该函数返回一个指示验证是否通过的布尔值,以及一个包含要显示的错误消息的字符串
然后在规则数组上循环并警告消息第一条返回false的规则。如果它们都返回true,请执行post。您可以将每个If语句拆分为一个函数,然后链接它们。比如说
//这里我们做一个闭包来验证,并返回一个承诺
//条件可以是一个函数
const validate=(条件,错误)=>()=>新承诺((res,rej)=>{
if(条件()){
res();
}否则{
错误;
}
});
const handleUpdatePassword=()=>{
const validateFieldsComplete=验证(
()=>!拒绝(密码)。长度,
字段不完整
);
const validateDifPassword=validate(
()=>curPassword!==newPassword,
difPassWord
);
// ...
validateFieldsComplete()
。然后(验证eDifPassword)
.然后(…)
.catch(警报,警报)
}
使用
管道
会更干净。你可以看看。或者,如果你以函数的方式被挖掘,你可以考虑使用.,我建议干掉<代码>警报。警报部分,因为所有的分支都有相同之处,只需生成一个表达式来计算警报消息。紧凑性并不总是万能的,但如果您需要,嵌套条件运算符就可以满足要求。我还重新安排了您的条件,以便它可以是一条平坦的if/ELSE链:
const message
= reject(passwords).length ? fieldNotComplete
: curPassword === newPassword ? difPassWord
: newPassword !== conPassword ? noMatch
: !validatePassword() ? pasReqs
: (isUsingName() || isPartOfUserID()) ? pasName
: null;
const isValid = !message;
if (!isValid) {
Alert.alert(message);
}
(请随意使用任何其他类型的代码格式模式;在我看来,无论使用哪种模式,嵌套的条件语句都会显得笨拙。)
编辑:
还有内联条件,它将简化计算并使其更加紧凑。我将设置一个包含测试和错误消息的validations对象,然后在其上循环。如果验证失败,它将抛出最后一条验证错误消息。使用这种方法,您只需在一个地方维护测试,而不必弄乱一块条件语句
const handleUpdatePassword = () => {
const validations = {
allFilled: {
test() {
return newPass && oldPass
},
error: 'Must fill out all fields'
},
correct: {
test() {
return curPass === oldPass
},
error: 'Incorrect password'
},
[...]
}
const invalid = () => {
let flag = false
for (let validation in validations) {
if (!validations[validation].test()) {
flag = validations[validation].error
}
}
return flag
}
if (invalid()) {
Alert.alert(invalid())
} else {
changePasswordPost(
{
userId,
curPass,
newPass
},
partyId
)
}
}
大家好,这是我用来解决问题的方法
const messages = [
{
alertMessage: difPassWord,
displayRule: different()
},
{
alertMessage: noMatch,
displayRule: match()
},
{
alertMessage: pasReqs,
displayRule: validatePassword()
},
{
alertMessage: pasName,
displayRule: !isUsingName() || !isPartOfUserID()
}
];
if (allFilled) {
const arrayLength = messages.length;
for (let i = 0; i < arrayLength; i++) {
if (messages[i].displayRule === false) {
Alert.alert(messages[i].alertMessage);
}
}
const消息=[
{
alertMessage:difPassWord,
displayRule:不同的()
},
{
警报信息:noMatch,
displayRule:match()
},
{
alertMessage:pasReqs,
displayRule:validatePassword()
},
{
alertMessage:pasName,
displayRule:!isUsingName()| |!isPartOfUserID()
}
];
如果(全部填写){
const arrayLength=messages.length;
for(设i=0;i
感谢@PatrickRoberts的重播。我更改了上面的代码,将定义值和执行检查的整个处理函数包含在内。任何关于如何简化此过程的建议都将非常好。我当然会这样做。