dynamic keys for object literals in Javascript
Prior to ECMAScript 2015 (ed 6), an object literal (ECMAScript calls it an "object initializer") key must be one of:
- IdentifierName
- StringLiteral
- NumericLiteral
So you couldn't use an expression as the key in an initialiser. This was changed as of ECMAScript 2015 (see below). You could use an expression with square bracket notation to access a property, so to set the properties with an expression you had to do:
var required = { directories : {}};
required.directories[this.applicationPath] = "Application " + this.application + " does not exists";
required.directories[this.applicationPath + "/configs"] = "Application config folder does not exists";
...
and so on. Since this.applicationPath
is reused a lot, better to store a reference to help with performance and cut down the amount of code:
var a = this.applicationPath;
var required = { directories : {}};
var rd = required.directories;
rd[a] = "Application " + this.application + " does not exists";
rd[a + "/configs"] = "Application config folder does not exists";
...
Edit
As of ECMAScript 2015 (ed 6), object initializers can have computed keys using:
[expression]: value
There is also shorthand syntax for property and method names.
See MDN: Object Initializer or ECMAScript Object Initializer.
Computed property names are supported in ECMAScript2015:
var name = 'key';
var value = 'value';
var o = {
[name]: value
};
alert("o as json : " + JSON.stringify(o));
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer
You can set dynamic keys is with bracket notation:
required.directories[this.applicationPath + "/configs"] = "Application config folder does not exists";
(of course wherever you do this definition, this.applicationPath
must exist)
But do you need this.applicationPath
in the keys? How do you access theses values? Maybe you can just remove this.applicationPath
from whatever value you use to access the properties.
But in case you need it:
You could use an array to initialize the keys if you want to avoid repeating a lot of code:
var dirs = ['configs', 'controllers', ...];
var files = ['init.js', 'controllers/index.js', ...];
var required = { directories: {}, files: {} };
required.directories[this.applicationPath] = "Application " + this.application + " does not exists";
for(var i = dirs.length; i--;) {
required.directories[this.applicationPath + '/' + dirs[i]] = "Application " + dirs[i] + " folder does not exists";
}
for(var i = files.length; i--;) {
// same here
}