In a recent project I had to validate a form in Javascript, I've done it thousands of times, but during this one instance I had a stroke of ... oh my god I can really do this
... moment. Essentially it cleaned up about 40 lines of code down to about five or six, and ontop of that, you can easily set variables inside your operation or outside, its just beautiful:
return (
(!(username += '') || username === '') ? { error: "No Username Given.", field: 'name' }
: (!(username += '') || password === '') ? { error: "No Password Given.", field: 'pass' }
: (username.length < 3) ? { error: "Username is less than 3 Characters.", field: 'name' }
: (password.length < 4) ? { error: "Password is less than 4 Characters.", field: 'pass' }
: (!/^([a-z0-9_-]+)$/i.test(username)) ? { error: "Username contains invalid characters.", field: 'name' }
: false
);
It's really it's own language if you think about it. It's just so concise and direct.
Validate existence:
(!username || username === '') ? { error: "No Username Given.", field: 'name' } // Doesn't Exist? Return this
: false // Otherwise, nothing to return; False is good. It means it passed validation.
Regular Expressions? Requirements? All easy.
(!/^([a-z0-9-_]+)$/i.test(username)) ? { error: "Username contains invalid characters.", field: 'name' } // Test username against RegExp, return this on failure
: false // It passed!
No problemo.
(!username) ?
(
(!password) ? { error: "Missing Username and Password.", field: ['name', 'pass'] }
: { error: "Missing Username", field: 'name' }
)
: false
Complex problems are still simple to solve in the end. It's so beautiful it hurts.
If you wish to setup variables in a normal manner you can do so on the lines before validation, this only works for things that are not null, undefined, false.
(username = username.toString()) &&
(password = password.toString()) &&
Another method in one statement:
(
username = username.toString() &&
password = password.toString()
) &&
Optional Variable Storage? No Problem.
(
username = username.toString() ||
password = password.toString() // Password is now set only if username is true.
) &&
A better method for this scenario would be to coerce the variable into a string: !(username += "")
and check it.
Or simply do it before the return ;)
Updated the hyphen to the end of the sentence, and the coercing is just for example really.
Reasons for not utilizing external libraries / HTML5(psuedo-working) features: Bulk and not fully flexible options. Not to mention they can break at any time or change, this is not dependent on a third party library only the language it was written on and meant to be concise.
This code really isn't duplication @lericson - I can understand where you might see it as duplicating code over and over but it doesn't it goes through the checks and stops when an error is found, otherwise the rest are not ran. The form actively helps users understand but sometimes users don't follow what they are told this is just an extra measure to defer that from happening.
@DTrejo your first example has an error, e doesn't exist, change it to a ;) - It's a good example and usage of an array to return multiple errors.
They are all great examples and clever ways of doing validation on single lines but this is the most compact and concise way of doing it I have found only utilizing if statements.
Sure a json validation schema is a better alternative but for simple validation, things that you don't need robust systems for, this is perfect.