Arnold Cristobal
Arnold Cristobal

Reputation: 851

javascript enhance if else inside for loop

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

Answers (3)

tdbts
tdbts

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

Sumner Evans
Sumner Evans

Reputation: 9155

You have a few options for optimizing the if statements.

  1. 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 switches in this MDN article.

  2. 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

Bergi
Bergi

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

Related Questions