2015-05-22 2 views
-1

Я хочу, чтобы его легко отформатировать, чтобы каждый мог понять конечный результат. В противном случае я хочу перекодировать, используя условие if. Может ли кто-нибудь помочь мне понять следующий код и отформатировать его более понятным способом.Прикованный троичный оператор в javascript

validate: function() { 
    return this.getRequired() && 
    !this.getValue() ? 
     (this.showError("Required"), !1) 
     : this.getValue() ? 
     "email" != this.getType() || this.isValidEmail() ? 
      "email_username" != this.getType() || this.isValidEmail() || this.isValidUsername() ? 
        "username" != this.getType() || this.isValidUsername() ? 
          "roomid" != this.getType() || this.isValidUsername() ? 
             "displayName" != this.getType() || this.isValidDisplayName() ? 
                "phone" != this.getType() || this.isValidPhone() ? !0 
                : (this.showError("Enter a valid phone number"), !1) 
             :(this.showError("Enter both first and last names"), !1) 
          :(this.showError("Enter a valid meeting room ID"), !1) 
        :(this.showError("Enter a valid username"), !1) 
      :(this.showError("Enter a valid email address or username"), !1) 
     :(this.showError("Enter a valid email address"), !1) 
    : !0 
} 
+0

с помощью переключателя на 'this.getType()' кажется, лучшее решение здесь. (Спасибо, @Barmar за исправление мозгового пердуна). –

+0

Невозможно отформатировать это так, чтобы это было понятно. Вложенные тройники по своей сути запутывают, просто не делайте этого. – Barmar

+0

Да, этот код - нечитаемый беспорядок. Вы можете искать онлайн-форматирование javascript. –

ответ

1

не уверен, что это сработает?

var items = ['email', 'email_username', 'etc']; 
for(var i=0;i<items.length;i++){ 
    switch(items[i]){ 
     case 'email': 
      if(items[i] != this.getType || items[i].isValidEmail()) 
      this.showError('Enter a valid email address'), !1) 
      break; 
     case 'email_username': 
      if(items[i] != this.getType || items[i].isValidEmail() || this.isValidUsername()) 
      this.showError('Enter a valid email address'), !1) 
      break; 
    } 
} 
+0

не будет столь же эффективным, но его, безусловно, легче следовать – stackoverfloweth

+0

При выполнении проверки формы эффективность вряд ли будет проблемой. Сколько кликов в секунду может выполнять пользователь? Полдюжины? – tadman

0

Вот часть кода, я только для электронной почты. Вам нужно будет сделать для остальных:

validate: function() { 
    var type = this.getType(); 
    var isValid = true; 
    if (this.getRequired() && !this.getValue()) { 
     switch (type) { 
      case "email": 
       if (!this.isValidEmail()) { 
        isValid = false; 
        this.showError("Enter a valid email address") 
       } 
       break; 
      case "email_username": 
       break; 
      case "username": 
       break; 
      case "roomid": 
       break; 
      case "displayName": 
       break; 
      case "phone": 
       break; 
     } 
    } 
    return isValid; 

} 
0

Это на самом деле нечитабельно. Это плохое форматирование. Я бы форматировать его примерно так:

return this.getRequired() && !this.getValue() 
    ? (this.showError("Required"), false) 
    : this.getValue() 
     ? "email" != this.getType() || this.isValidEmail() 
      ? "email_username" != this.getType() || this.isValidEmail() || this.isValidUsername() 
       ? "username" != this.getType() || this.isValidUsername() 
        ? "roomid" != this.getType() || this.isValidUsername() 
         ? "displayName" != this.getType() || this.isValidDisplayName() 
          ? "phone" != this.getType() || this.isValidPhone() 
           ? true 
           : (this.showError($L("Enter a valid phone number")), false) 
          : (this.showError("Enter both first and last names"), false) 
         : (this.showError("Enter a valid meeting room ID"), false) 
        : (this.showError("Enter a valid username"), false) 
       : (this.showError("Enter a valid email address or username"), false) 
      : (this.showError("Enter a valid email address"), false) 
     : true 

Это определенно кажется грубым, но это экономит на тонну отдельных заявлений возврата, по линиям «, если это, то это вернуть, иначе, если это, это вернуть .. .. "и т. д.

Кроме того, да, синтаксис !1 совершенно лишний.

Редактировать: причина, по которой переключатель не работает, заключается в том, что логика вложенная. Вы либо закончите с вложенными операторами if, которые заменяют тройники, либо вам придется переписать логику. Если он работает ... отлично. Испытайте его и проверьте, возможно ли рефакторинг. Если нет ... Надеюсь, у вас есть бизнес-правила для этой вещи.

0

почему бы не использовать некоторые более читаемый формат, как это:

validate: function() { 
    var ok = false; 
    switch (true) { 
     case (this.getRequired() && !this.getValue()): 
      this.showError("Required"); 
      break; 
     case ("email" === this.getType() && !this.isValidEmail()): 
      this.showError("Enter a valid email address"); 
      break;//           
     case ("email_username" === this.getType() && (!this.isValidEmail() || !this.isValidUsername())): 
      this.showError("Enter a valid email address or username"); 
      break; 
     case ("username" === this.getType() && !this.isValidUsername()): 
      this.showError("Enter a valid username"); 
      break; 
     case ("roomid" === this.getType() && !this.isValidUsername()): 
      this.showError("Enter a valid meeting room ID"); 
      break; 
     case ("displayName" === this.getType() && !this.isValidDisplayName()): 
      this.showError("Enter both first and last names"); 
      break; 
     case ("phone" !== this.getType() && !this.isValidPhone()): 
      this.showError($L("Enter a valid phone number")); 
      break; 
     default: ok = true; 
    } 
    return ok; 
}