What the Heck can you destruct a destructor?
By: Brad
Hey Brad ECMAScript 2015 added Object Destructuring assignment but I was wondering can you destruct a nested object?

I see so the question is what if I was given req.body but I’m just interested in req.body.device.id do I have to use the full name or can I destruct the object so that I only get a reference to the ID?
const req = {
body: {
device: {
id: 'hello',
},
hello: 'world',
},
};
Given the above how would I destruct this object to just get a reference to the id property?
Destructuring
For those unfamiliar with destructuring it is a new feature in ES2015 which lets you decompose an object and pluck out a property from the object.
const myObject = { hello: 'world' };
const { hello } = myObject;
console.log(`hello ${hello}`);
// prints hello world
In the above we take the object myObject which has a property called hello and destruct it to just pull out the hello property and store it in a const variable named hello. This way we can access the hello property without needing a reference to the parent object.
Deep Matching Object Destruction
So it turns out destructing a destructed property has a name and it is Deep Matching Object Destruction.
const { device: { id }, hello: world } = Object.assign({ device: { id: '', type: '' }, client: { type: '' } }, req.body)
What is going on above is that I’m destructing req.body by plucking the value at req.body.device into a variable called device but then providing it an alias but instead of using a variable name I use another destruct assignment ({ id }). This will actually be destructing the nameless alias, since I didn’t actually provide the alias a name, into the reference id.
Wait what is the point of the Object.assign?
Ah yes well that is for safety. See we are trying to destruct req.body.device.id but if req.body does not have a device property it will be undefined and undefined can not be deconstructed thus an error will be thrown. Here I was using Object.assign to provide default values to the req.body.device property so if it does not exist it won’t blow up.
Of course their is a better way to do that and that is to use defaults in your destruction assignment itself.
You can provide default values when destructing to apply to the variable if the object is missing the requested property
const myObject = {};
const { hello: world = 'world' } = myObject;
console.log(`hello ${world}`);
// prints hello world
We can use this syntax to ensue that if req.body is missing the device property things won’t explode
const { device: { id } = {}, hello: world = '' } = req.body
So now if req.body is empty device will default to an empty object which can be destructed but since id is missing it will default automatically to undefined per the way JavaScript object property look up works so id will be undefined which we can write handlers for without the need to catch an exception.
So yes you can deconstruct a nested object via Deep Matching Object Destruction.
Until next time think imaginatively and design creatively
![]()