Buscando una alternativa a la declaración condicional. Como puede ver en mi código, el proceso es demasiado repetitivo y desorganizado. Será cada vez más difícil mantener el código a medida que crece en tamaño. Para evitar esta situación, estoy buscando alternativas.
function validate(values) { let errors = {}; // Email Error if (!values.email) { errors.email = "Email address is required"; } else if (!/\S+@\S+\.\S+/.test(values.email)) { errors.email = "Email address is invalid"; } // Password Error if (!values.password) { errors.password = "Password is required"; } else if (values.password.length < 6) { errors.password = "Password must be 6 or more characters"; } return errors; }Podría mover algo de lógica a la configuración. Intente armonizar las comprobaciones de modo que todas dependan de expresiones regulares. Entonces, para una longitud mínima de 6, use /....../ como expresión regular. También asegúrese de que la expresión regular no acepte una cadena vacía en caso de que el campo se considere obligatorio.
Por ejemplo:
// All specifics are encoded here: const checks = [ { field: "email", regex: /^\S+@\S+\.\S+$/, name: "Email address", msg: "must be 6 or more characters" }, { field: "password", regex: /....../, name: "Password", msg: "is invalid" }, ]; // ...while this is now (more) generic: function validate(values) { const errors = {}; for (const {field, regex, name, msg} of checks) { if (!regex.test(values[field])) { errors[field] = name + " " + (values[field] ? msg : "is required"); } } return errors; }En este momento, la función de validación se usa tanto para contraseñas como para correos electrónicos.
Sin embargo, esto se puede dividir en dos funciones, una para validar correos electrónicos y otra para validar contraseñas. Esto ayuda a desvincular la acción de validar correos electrónicos de validar contraseñas y facilita la depuración/mantenimiento.
Además, puede probar operadores ternarios si desea que sus cláusulas if-else estén menos desordenadas.
function validate(values) { errors = {}; errors.email = validate_email(values.email) == null ? null : validate_email(values.email); errors.password = validate_password(values.password) == null ? null : validate_password(values.password); return errors; } function validate_email(email) { if (email == null) { return "Email address is required"; } else if (!/\S+@\S+\.\S+/.test(values.email)) { return "Email address is invalid"; } return null; } //validate_password left as an exercisePuede acceder a la columna en un objeto js usando myObject[nameOfYourColumn]
Entonces podemos pensar en construir un método genérico como este
function validateColumn(object, columnName, format, errors) { if (!object[columnName]) { errors[columnName] = `${columnName} is required`; } else if (!format.test(object[columnName])) { errors[columnName] = `${columnName} is invalid`; } }tu método se convertirá
function validate(values) { let errors = {}; // Email Error validateColumn(values, 'email', '/\S+@\S+\.\S+/', errors); // Password Error validateColumn(values, 'password', '/^.{6,}$/', errors); return errors; }