I’ve never been a developer so getting into JavaScript was quite a challenge at first and I probably always went the longest route possible to achieve something. As I use it more and more, I am picking up these neat little tricks and uses for built in methods that make my life easier.
In the world of vRA and vRO, I find that most of my time is spent iterating over arrays or parsing custom properties. One method that I have come to find extremely useful is the indexOf() that is available on Arrays and Strings. The methods are very similar but have very different use cases. Let’s take a look at each of them in turn.
String indexOf() Method
w3schools.com defines this as:
The indexOf() method returns the position of the first occurrence of a specified value in a string.
This method returns -1 if the value to search for never occurs.
So as an example, if we had the string “simplygeek.co.uk is fun”
string.indexOf(“m”) would return 2, which is the index within the string that ‘m’ first appears. Note that if ‘m’ appeared twice then only the first match would return a result. Indexes within arrays and strings always start at 0.
Another use case, one which I find the most useful, is being able to provide a string for the lookup. Take the following example:
string.indexOf(“simplygeek”) would return 0, because in a contiguous match the first index is returned.
When writing JavaScript that interacts with vRA you are often required to parse through custom properties, which are key value pairs of data. Such properties can contain useful information that relates to a deployment, such as virtual machine configuration. If custom properties follow a standardised naming convention, it can be easy to discover a set of properties. Let’s assume I have created the following custom properties in vRA for a deployment:
Custom.Deployment.Virtualmachine.Config.hotcpu : true
Custom.Deployment.Virtualmachine.Config.hotmem : true
Custom.Deployment.Virtualmachine.Config.sched.swap.vmxSwapEnabled : true
When the payload is sent to my vRO workflow it could contain over a 100 different key:value pairs of data. To find these easily I can use the indexOf method to iterate over each pair as follows:
var deploymentProp = new Properties; var arrayOfDeploymentProps = []; for each (var key in props.keys) { if (key.indexOf("Custom.Deployment.Virtualmachine.Config") === 0) { // We found a deployment property! deploymentProp.put(key, props.get(key)); arrayOfDeploymentProps.push(deploymentProp); } }
The above will result in an array of properties related to virtual machine configs. I can then pass this array to some code that will handle the implementation of these advanced virtual machine settings. This allows for a very dynamic way to manage custom properties in property groups within vRA.
Array indexOf() method
Very similar to the String method, on an array, the indexOf() method returns the first index at which a given element can be found in the array, or -1 if it is not present. I find this method useful when I need to return a set of unique values from another array. let’s assume we have the following array:
myArray = [‘one’, ‘two’, ‘two’, ‘three’, ‘three’, ‘three’]
If I wanted to return only unique items from myArray, I could use the indexOf method as follows:
var myArray = ['one', 'two', 'two', 'three', 'three', 'three']; var uniqueItems = []; for each (var item in myArray) { if (uniqueItems.indexOf(item) === -1) { // we didn't find this item in the array so add it. uniqueItems.push(item); // When we get to the second 'two', the value of indexOf() will return '2' and the code above will not be executed. } }
The above code will result in an array:
[‘one’, ‘two’, ‘three’]
I hope that someone else finds these as useful as I have. If you know of more use cases, then please let me know.