Hopp til hovedinnhold

Destructuring your structures

In the magic year of 2015 I started my career in Bekk and we were introduced to destructuring in Javascript through ES6. Before this we had to assign values from objects and arrays the hard way.

position = {
  latitude: 59.911491,
  longitude: 10.757933,
}
let longitude = position.longitude;
let latitude = position.latitude;
console.log(`lat: ${latitude}, long: ${longitude}`); // lat: 59.911491, long: 10.757933

This can be really cumbersome for larger structures. Destructuring allow us to assign these values in a simpler way:

position = {
  latitude: 59.911491,
  longitude: 10.757933,
}
let { latitude, longitude } = position;
console.log(`lat: ${latitude}, long: ${longitude}`); // lat: 59.911491, long: 10.757933

Custom variable names

If we wanted to name our variables lat and long instead we could destructure like this:

position = {
  latitude: 59.911491,
  longitude: 10.757933,
}
let { longitude: long, latitude: lat } = position;
console.log(`lat: ${lat}, long: ${long}`); // lat: 59.911491, long: 10.757933

While not as straightforward, it provide powerful flexibility to our destructuring.

Nested destructuring

Destructuring nested objects is just as simple really. The difference is that we have to account for the structure when we assign the variables.

let city = {
  name: 'Oslo, Norway',
  position: {
    latitude: 59.911491,
    longitude: 10.757933,
  }
}
let { name, position: { longitude, latitude } } = city;
console.log(`${name} - lat: ${latitude}, long: ${longitude}`); // Oslo, Norway - lat: 59.911491, long: 10.757933

Default values

To save ourself a lot of lines checking for undefined values if the property we try to assign from does not exist, we can set default values when we destructure.

let city = {
  name: 'Oslo, Norway',
}
let { name, position: { longitude = 0.0, latitude = 0.0 } = {} } = city;
console.log(`${name} - lat: ${latitude}, long: ${longitude}`); // Oslo, Norway - lat: 0.0, long: 0.0

As you can see in this example, we have to provide a default value to position as well as latitude and longitude for the default values in a nested object to work.

Named parameters

When programming Javascript I use destructuring a lot as named parameters in functions.

const doSomthing = ({ a, b, c }) => {
  console.log(a,b,c);
}
doSomthing({a: 'test', b: 1, c: true}); // test 1 true

This allow us to use all the destructuring functionality above on the parameters to a function. Does providing default values to function parameters sound appealing? You bet. A long with other obvious advantages such as ignoring parameter ordering when using the function.

const doSomthing = ({ a = 'info', b, c = false }) => {
  console.log(a,b,c);
}
logValues({ b: 1, c: true}); // info 1 true

Relevant resources recommended by the author

Did you like the post?

Feel free to share it with friends and colleagues