Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用类似的条件规则压缩if、else JS_Javascript_If Statement_Conditional Statements - Fatal编程技术网

Javascript 使用类似的条件规则压缩if、else JS

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 ==

试图找到一种方法来浓缩这一点。我不确定做这件事的最佳方法。基本上,如果符合条件,我会显示一个带有参数的警报,该参数就是消息。我在考虑也许在功能上试试。这是更大功能组件的一部分。我也在想,如果我能找到一种方法来浓缩其他的if,我可以用三元。提前感谢您的帮助

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的重播。我更改了上面的代码,将定义值和执行检查的整个处理函数包含在内。任何关于如何简化此过程的建议都将非常好。我当然会这样做。