У меня есть код, который проверяет, заполнены ли все поля формы данными, но входные данные моей формы отображаются динамически в зависимости от условия this.id_company. Как вы можете видеть, если this.is_company равен TRUE, то проверка также должна проверить, вставил ли пользователь this.taxNumber и this.copmany

isComplete: function () {
    if (this.is_company) {
        return this.firstName && this.lastName && this.email && this.password && this.address && this.postNumber
            && this.city && this.id_country && this.iAggre && this.taxNumber && this.company
    }
    return this.firstName && this.lastName && this.email && this.password && this.address && this.postNumber
        && this.city && this.id_country && this.iAggre;
}

Я ищу лучший способ упростить мой код Javascript. Можете ли вы, парень, привести примеры. Спасибо

0
Valor_ 24 Фев 2018 в 14:04

6 ответов

Лучший ответ

Для простоты просто используйте или:

return (
   this.firstName && 
   this.lastName && 
   this.email && 
   this.password && 
   this.address && 
   this.postNumber && 
   this.city && 
   this.id_country && 
   this.iAggre && 
   (!this._isCompany || this.taxNumber && this.company)
);

Быть прочитанным как и не является компанией или имеет taxNumber и свойство компании .

5
Jonas Wilms 24 Фев 2018 в 11:10

Лучше всего сводить каждую функцию к ее простейшей форме. @ jonas-w двигался в правильном направлении, вычисляя значения. Имя метода документирует, что означает результат, и облегчает понимание условия.

Вы всегда можете создать закрытые методы isCompanyComplete() и isPersonComplete(), если не хотите их показывать.

Распределение логических операторов (&&) по отдельным строкам делает оператор намного более читабельным.

Разделение троичного оператора по отдельным строкам также дает понять, какие части относятся к логически истинным или ложным.

Избегайте инвертирования логики в условиях (!this.is_company).

class Form {

  isPersonComplete() {
    return !!(
      this.firstName 
      && this.lastName 
      && this.email 
      && this.password 
      && this.address 
      && this.postNumber
      && this.city 
      && this.id_country 
      && this.iAgree 
    );
  }

  isCompanyComplete() {
    return !!(
      this.isPersonComplete()
      && !!this.taxNumber 
      && !!this.company
    );
  }

  isComplete() {
    return this.is_company 
      ? this.isCompanyComplete() 
      : this.isPersonComplete();
  }
  
}

const form = new Form()
console.log(
  'Person: ' + form.isPersonComplete(), 
  'Company: ' + form.isCompanyComplete(), 
  'Completed: ' + form.isComplete()
  );


form.firstName = 'John';
form.lastName = 'Smith';
form.email = 'john@smith.co';
form.password = 'somesecret';
form.address = '123 main street, anywhere';
form.postNumber = '12345';
form.city = 'Metropolis';
form.id_country = 1;
form.iAgree = true;
console.log(
  'Person: ' + form.isPersonComplete(), 
  'Company: ' + form.isCompanyComplete(), 
  'Completed: ' + form.isComplete()
  );

form.is_company = true;
form.taxNumber = 12345;
form.company = 'John Smith & Co';
console.log(
  'Person: ' + form.isPersonComplete(), 
  'Company: ' + form.isCompanyComplete(), 
  'Completed: ' + form.isComplete()
  );
1
Dave Meehan 24 Фев 2018 в 23:08

Это работает для вас?

isComplete: function () { 
    let result = this.firstName && this.lastName && this.email && this.password && this.address && this.postNumber && this.city && this.id_country && this.iAggre;
    if (this.is_company) result += this.taxNumber && this.company;
    return result; 
}
-3
SindreKjr 24 Фев 2018 в 11:12

То, что этот вопрос «в первую очередь основан на мнении» и т. Д., Уже установлено, так что, черт возьми, вот еще одно предложение:

function form() {
  this.vld = {
    fields: ["firstName", "lastName", "email", "password", "address", "postNumber", "city", "id_country", "iAggre"],
    check: arr => !arr.some(el => !this[el]),
    isComplete: () => this.vld.check(this.vld.fields) && (!this.is_company || this.vld.check(["taxNumber", "company"]))
  }
}

var stuff = new form();

stuff.firstName = "Alice";
stuff.lastName = "Bob";
stuff.email = "alice@bob.com";
stuff.password = "12abc123";
stuff.address = "123 Main St";
stuff.postNumber = "12345";
stuff.city = "Springfield";
stuff.id_country = 1;
console.log(false, stuff.vld.isComplete());

stuff.iAggre = true;
console.log(true, stuff.vld.isComplete());

stuff.is_company = true;
stuff.taxNumber = "123456789";
console.log(false, stuff.vld.isComplete());

stuff.company = "Moe's";
console.log(true, stuff.vld.isComplete());

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

1
Chris G 24 Фев 2018 в 11:41

Более приятная и легкая для чтения версия:

isComplete: function () {
    var baseCondition = this.firstName && this.lastName && this.email 
        && this.password && this.address && this.postNumber
        && this.city && this.id_country && this.iAggre

    var companyCondition = baseCondition && this.taxNumber && this.company;

    return this.is_company ? companyCondition : baseCondition;
}
4
Bentaye 24 Фев 2018 в 11:25

Вы можете сгруппировать свои поля в массив и условно заполнить поля company и taxNumber:

var validate = function(isCompany) {
  var validateFields = [
    this.firstName,
    this.lastName,
    this.email,
    this.password,
    this.address,
    this.postNumber,
    this.city,
    this.id_country,
    this.iAggre
  ];

  if (isCompany) {
    validateFields.push(this.company, this.taxNumber);
  }

  return validateFields.find(f => !f) === undefined;
}

var isComplete = function() {
  return validate(this.is_company);
}
1
Daniel Conde Marin 24 Фев 2018 в 11:21