0

I have an array which basically holds 3 values:

  • listingname
  • listingdummy
  • bootloadername

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?

1
  • There is no way to dynamically construct variable names (though it can be emulated for properties of the global object and hence global variables). The usual solution is to use an object to store values instead of variables: obj['parameter' + firmwareTypes[i]].required = false. Commented May 13, 2015 at 3:06

3 Answers 3

1

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;
        });
    }
});
Sign up to request clarification or add additional context in comments.

Comments

1

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;
    }
}

Comments

1

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');
    

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.