Reputation: 851
I have an array which basically holds 3 values:
This values are being used to disable elements in html if they exist in the array. A piece of code I created is working but looking at it, there must be a better way to write it.
for (var i = 0; i < firmwareTypes.length; i++) {
if (firmwareTypes[i] == "listingname") {
parameterlistingname.required = false;
parameterlistingfile.required = false;
}
if (firmwareTypes[i] == "listingdummy") {
parameterlistingdummyname.required = false;
parameterlistingdummyfile.required = false;
}
if (firmwareTypes[i] == "bootloadername") {
bootloadername.required = false;
bootloaderfile.required = false;
}
}
Is there a way in javascript to like compare certain string lengths of id elements so I can just use one if condition. Something like:
for (var i = 0; i < firmwareTypes.length; i++) {
if (firmwareTypes[i].contains(???) {
bootloader*.required = false;
}
}
or just make the code a lot cleaner?
Upvotes: 0
Views: 69
Reputation: 525
Perhaps this might work:
var types = {
'listingname': [parameterlistingname, parameterlistingfile],
'listingdummy': [parameterlistingdummyname, parameterlistingdummyfile],
'bootloadername': [bootloadername, bootloaderfile]
};
firmwareTypes.forEach(function (firmware) {
if (firmware in types) {
types[firmware].forEach(function (item) {
item.required = false;
});
}
});
Upvotes: 1
Reputation: 9155
You have a few options for optimizing the if
statements.
Use a switch
:
switch (firmwareTypes[i]) {
case 'listingname':
parameterlistingname.required = false;
parameterlistingfile.required = false;
break;
case 'listingdummy':
parameterlistingdummyname.required = false;
parameterlistingdummyfile.required = false;
break;
case 'bootloadername':
bootloadername.required = false;
bootloaderfile.required = false;
break;
}
Notice the break;
statements at the end of each case.
You can read more about switch
es in this MDN article.
Assign each variable individually:
var ft = firmwareTypes[i];
parameterlistingname.required = (ft === 'listingname');
parameterlistingfile.required = (ft === 'listingname');
parameterlistingdummyname.required = (ft === 'listingdummy');
parameterlistingdummyfile.required = (ft === 'listingdummy');
bootloadername.required = (ft === 'bootloadername');
bootloaderfile.required = (ft === 'bootloadername');
Upvotes: 1
Reputation: 665130
If you'd use an object instead of multiple variables, then yes you can make that a lot simpler:
var fileParameters = {
listingname: {required: true},
listingdummy: {required: true},
bootloadername: {required: true}
};
var nameParameters = {
listingname: {required: true},
listingdummy: {required: true},
bootloadername: {required: true}
};
for (var i = 0; i < firmwareTypes.length; i++) {
if (firmwareTypes[i] in fileParameters) {
fileParameters[firmwareTypes[i]].required = false;
nameParameters[firmwareTypes[i]].required = false;
}
}
Upvotes: 1