Javascript

Javascript Extracting Variables From Arrays And Objects With Object Destruction

javascript object destruction

In this post i will show you a very powerful feature in Ecma script 2015 which is the Object Destruction feature and how to extract variables from array and object keys.

 

 

Object Destruction means tear a part an object or array into it’s original items which is the inverse of Construction where you build up some sort of collection using keys and values, so the destruction is the process of extracting an object or array items into separate variables where the name of the variable is something you define and the value is the corresponding on that array or object. This feature already exist in a lot of language such as PHP and Python.

 

Terminology

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// for arrays
[variable1, variable2, variable3] = array()
for objects
{variable1, variable2, variable3} = {}
// for arrays [variable1, variable2, variable3] = array() for objects {variable1, variable2, variable3} = {}
// for  arrays
[variable1, variable2, variable3] = array()

for objects
{variable1, variable2, variable3} = {}

As you see in the above terminology we assign the right hand side which can be an array or object to the left hand side which also can be and array or variables or object of variables.

 

Destructing Arrays

Let’s imagine we have this array

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
var months = ['January', 'February', 'March', 'April'];
var months = ['January', 'February', 'March', 'April'];
var months = ['January', 'February', 'March', 'April'];

Now if we want to extract this 4 element array to 4 variables like this:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
var [first_day, second_day, third_day, fourth_day] = months;
console.log(first_day, second_day, third_day, fourth_day);
// output
January
February
March
April
var [first_day, second_day, third_day, fourth_day] = months; console.log(first_day, second_day, third_day, fourth_day); // output January February March April
var [first_day, second_day, third_day, fourth_day] = months;

console.log(first_day, second_day, third_day, fourth_day);

// output
January
February
March
April

As you see from the output the values assigned in the order which they defined in the array.

You can also declare the variables first:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
var first_day, second_day, third_day, fourth_day;
[first_day, second_day, third_day, fourth_day] = months;
console.log(first_day, second_day, third_day, fourth_day);
var first_day, second_day, third_day, fourth_day; [first_day, second_day, third_day, fourth_day] = months; console.log(first_day, second_day, third_day, fourth_day);
var first_day, second_day, third_day, fourth_day;

[first_day, second_day, third_day, fourth_day] = months;

console.log(first_day, second_day, third_day, fourth_day);

 

Using default values

In cases where the array contains just little values than the defined variables on the left side you can assign those variables default values which will be replaced by undefined for example:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
[first_day='jan', second_day='feb', third_day='march', fourth_day='april'] = ['January'];
console.log(first_day);
console.log(second_day);
console.log(third_day);
console.log(fourth_day);
// output
January
feb // the default value
march // the default value
april // the default value
[first_day='jan', second_day='feb', third_day='march', fourth_day='april'] = ['January']; console.log(first_day); console.log(second_day); console.log(third_day); console.log(fourth_day); // output January feb // the default value march // the default value april // the default value
[first_day='jan', second_day='feb', third_day='march', fourth_day='april'] = ['January'];

console.log(first_day);
console.log(second_day);
console.log(third_day);
console.log(fourth_day);

// output
January    
feb        // the default value
march      // the default value
april      // the default value

 

Ignoring specific values

If you need to ignore specific values in the array you can replace it by empty variable like this:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
var [first_day, , third_day, ] = months;
console.log(first_day);
console.log(third_day);
// output
January
March
var [first_day, , third_day, ] = months; console.log(first_day); console.log(third_day); // output January March
var [first_day, , third_day, ] = months;

console.log(first_day);
console.log(third_day);


// output
January
March

What if you want to assign the rest of the array to a variable, you can accomplish this using the rest expression like shown below:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
[first_day, ...other_days ] = months;
console.log(first_day);
console.log(other_days);
// output
January
Array [ "February", "March", "April" ]
[first_day, ...other_days ] = months; console.log(first_day); console.log(other_days); // output January Array [ "February", "March", "April" ]
[first_day, ...other_days ] = months;

console.log(first_day);
console.log(other_days);


// output
January
Array [ "February", "March", "April" ]

But don’t use a trailing comma after the rest expression like this:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
[first_day, ...other_days, ] = months; // Error: rest element may not have a trailing comma
[first_day, ...other_days, ] = months; // Error: rest element may not have a trailing comma
[first_day, ...other_days, ] = months;    // Error: rest element may not have a trailing comma

 

Destructing Objects

Destruction in objects works in the same fashion as arrays, you specify an object of the right side to be assigned to any object of variables on the left side

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
let months = {first_day: 'January', second_day: 'February', third_day: 'March'};
let months = {first_day: 'January', second_day: 'February', third_day: 'March'};
let months = {first_day: 'January', second_day: 'February', third_day: 'March'};
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
let {first_day, second_day, third_day} = months;
console.log(first_day);
console.log(second_day);
console.log(third_day);
let {first_day, second_day, third_day} = months; console.log(first_day); console.log(second_day); console.log(third_day);
let {first_day, second_day, third_day} = months;

console.log(first_day);
console.log(second_day);
console.log(third_day);

As you see above we specified the variables in object expression instead of array expression, you can also declare the variables first:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
let first_day, second_day, third_day;
({first_day, second_day, third_day} = months);
let first_day, second_day, third_day; ({first_day, second_day, third_day} = months);
let first_day, second_day, third_day;

({first_day, second_day, third_day} = months);

Note here the parentheses is needed in case of object destruction if you omit them you will get a syntax error.

Using new variable names as object values

You can use new variable names as the object values instead of the object keys when extracting like this:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
({first_day: first, second_day: second, third_day: third} = months);
console.log(first);
console.log(second);
console.log(third);
({first_day: first, second_day: second, third_day: third} = months); console.log(first); console.log(second); console.log(third);
({first_day: first, second_day: second, third_day: third} = months);

console.log(first);
console.log(second);
console.log(third);

 

Object destructing default values

Default values works in the same manner as arrays, you pass the object keys in the left side a default value like this example:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
({first_day, second_day = 'feb', third_day = 'march'} = {first_day: 'January'});
console.log(first_day);
console.log(second_day);
console.log(third_day);
// output
January
feb
march
({first_day, second_day = 'feb', third_day = 'march'} = {first_day: 'January'}); console.log(first_day); console.log(second_day); console.log(third_day); // output January feb march
({first_day, second_day = 'feb', third_day = 'march'} = {first_day: 'January'});

console.log(first_day);
console.log(second_day);
console.log(third_day);


// output
January
feb
march

As you see above we passed default values to the second and third items in the object so that those values be used in case no actual value exist.

You can use also new naming with the default values as in this example:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const {width: W = 10, height: H = 5} = {width: 3};
console.log(W); // 3
console.log(H); // 5
const {width: W = 10, height: H = 5} = {width: 3}; console.log(W); // 3 console.log(H); // 5
const {width: W = 10, height: H = 5} = {width: 3};

console.log(W); // 3
console.log(H); // 5

 

Function parameter default values

Object destruction can very helpful when setting function parameters default values easily, remember in the old days to set default values for the function you may have done something like this:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
function do_something(options)
{
options = options === undefined ? {} : options;
var param1 = options.param1 === undefined ? '' : options.param1;
var param2 = options.param2 === undefined ? '' : options.param2;
}
function do_something(options) { options = options === undefined ? {} : options; var param1 = options.param1 === undefined ? '' : options.param1; var param2 = options.param2 === undefined ? '' : options.param2; }
function do_something(options)
{
    options = options === undefined ? {} : options;
    var param1 = options.param1 === undefined ? '' : options.param1;
    var param2 = options.param2 === undefined ? '' : options.param2;
}

But using the object destruction syntax this example can be simplified as shown here:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
function do_something({param1 = 5, param2 = true} = {})
{
console.log(param1, param2);
}
do_something();
do_something({
param1: 20
});
do_something({
param2: false
});
do_something({
param1: 45,
param2: false
});
function do_something({param1 = 5, param2 = true} = {}) { console.log(param1, param2); } do_something(); do_something({ param1: 20 }); do_something({ param2: false }); do_something({ param1: 45, param2: false });
function do_something({param1 = 5, param2 = true} = {})
		{
    		console.log(param1, param2);
		}
	
		do_something(); 
		do_something({
			param1: 20
		});

		do_something({
			param2: false
		});

		do_something({
			param1: 45,
			param2: false
		});

Note how the object destruction syntax makes it easy to use the default values without going through the nasty checks as in the first function, now you can call the function without parameters , with only one parameter or with the two parameters.

Nested Objects

The power of object destruction comes in handy when you need to capture nested object expressions without having to navigate all the object deep to get a certain value, consider this example from google maps autocomplete api response:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
let autocompleteResponse = {
address_components: [
{ long_name: "58", short_name: "58", types: [] },
{ long_name: "Helsinki", short_name: "HKI", types: [] },
{ long_name: "Finland", short_name: "FI", types: [] },
{ long_name: "00500", short_name: "00500", types: [] }
],
adr_address: "Hämeentie 58 Helsinki Finland",
formatted_address: "Hameentie 58, 00500 Helsinki, Finland",
geometry: {
location: {
lat: "34.68484",
lng: "67.43333"
}
},
icon: "https://maps.gstatic.com/mapfiles/place_api/icons/geocode-71.png",
id: "1e60bcce0153a978681bd4caf8504c3438f91555",
name: "Hämeentie 58",
place_id: "ChIJnRTUNHkJkkYRttAbgCFYfPw",
plus_code: { compound_code: "5XQ7+88 Helsinki, Finland", global_code: "9GG65XQ7+88" },
zip_code: "00500"
};
let autocompleteResponse = { address_components: [ { long_name: "58", short_name: "58", types: [] }, { long_name: "Helsinki", short_name: "HKI", types: [] }, { long_name: "Finland", short_name: "FI", types: [] }, { long_name: "00500", short_name: "00500", types: [] } ], adr_address: "Hämeentie 58 Helsinki Finland", formatted_address: "Hameentie 58, 00500 Helsinki, Finland", geometry: { location: { lat: "34.68484", lng: "67.43333" } }, icon: "https://maps.gstatic.com/mapfiles/place_api/icons/geocode-71.png", id: "1e60bcce0153a978681bd4caf8504c3438f91555", name: "Hämeentie 58", place_id: "ChIJnRTUNHkJkkYRttAbgCFYfPw", plus_code: { compound_code: "5XQ7+88 Helsinki, Finland", global_code: "9GG65XQ7+88" }, zip_code: "00500" };
let autocompleteResponse = {
			address_components: [
				{ long_name: "58", short_name: "58", types: [] },
				{ long_name: "Helsinki", short_name: "HKI", types: [] },
				{ long_name: "Finland", short_name: "FI", types: [] },
				{ long_name: "00500", short_name: "00500", types: [] }
			],
			adr_address: "Hämeentie 58 	Helsinki Finland",
			formatted_address: "Hameentie 58, 00500 Helsinki, Finland",
			geometry: {
			    location: {
			        lat: "34.68484",
					lng: "67.43333"
				}
			},
            icon: "https://maps.gstatic.com/mapfiles/place_api/icons/geocode-71.png",
            id: "1e60bcce0153a978681bd4caf8504c3438f91555",
            name: "Hämeentie 58",
            place_id: "ChIJnRTUNHkJkkYRttAbgCFYfPw",
            plus_code: { compound_code: "5XQ7+88 Helsinki, Finland", global_code: "9GG65XQ7+88" },
            zip_code: "00500"
		};

Now if for example you need to access some nested keys like lat or lng you may have to do something like this:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
let lat = autocompleteResponse.geometry.location.lat;
let lng = autocompleteResponse.geometry.location.lng;
let lat = autocompleteResponse.geometry.location.lat; let lng = autocompleteResponse.geometry.location.lng;
let lat = autocompleteResponse.geometry.location.lat;
let lng = autocompleteResponse.geometry.location.lng;

Using object expressions this can simplified like shown below:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
let { lat, lng } = autocompleteResponse.geometry.location;
console.log(lat);
console.log(lng);
let { lat, lng } = autocompleteResponse.geometry.location; console.log(lat); console.log(lng);
let { lat, lng } = autocompleteResponse.geometry.location;

console.log(lat);
console.log(lng);

As you see we extracted the nested properties with an easy way using the closest parent autocompleteResponse.geometry.location

Using the same methodology we can access other values like this:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
let { compound_code, global_code } = autocompleteResponse.plus_code;
console.log(compound_code);
console.log(global_code);
// Iterating and object destruction
for(var {long_name, short_name} of autocompleteResponse.address_components) {
console.log("long name: " + long_name + " - short name: " + short_name);
}
let { compound_code, global_code } = autocompleteResponse.plus_code; console.log(compound_code); console.log(global_code); // Iterating and object destruction for(var {long_name, short_name} of autocompleteResponse.address_components) { console.log("long name: " + long_name + " - short name: " + short_name); }
let { compound_code, global_code } = autocompleteResponse.plus_code;

console.log(compound_code);
console.log(global_code);


// Iterating and object destruction
for(var {long_name, short_name} of autocompleteResponse.address_components) {
     console.log("long name: " + long_name + " - short name: " + short_name);
}

 

0 0 votes
Article Rating

What's your reaction?

Excited
1
Happy
1
Not Sure
1
Confused
2

You may also like

Subscribe
Notify of
guest


0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments