I am trying to convert an object to a leaner version using destructuring.
My object includes a nested array which also contains objects, from this array I would only like a few fields.
I can do the nested object destructuring fine, and the array destructuring fine but not together?
My current try looks like this:
var data = {
title: "title1",
bar: "asdf",
innerData: [
{
title: "inner-title1",
foo: "asdf"
},
{
title: "inner-title2",
foo: "asdf"
}
]
};
var { title, innerData: [ { title} ] } = data;
console.log(title);
for (var { title} of innerData) {
console.log(title);
}
But get a message saying innerData is not defined.
The outcome I would like might be:
{
title: "title1",
innerData: [
{
title: "inner-title1"
},
{
title: "inner-title2"
}
]
};
We can also use destructuring when we are working with nested data structures such as a nested object. Let's start by looking at destructuring a nested object enclosed within an array. }]; The above array is assigned to a variable called cats, it contains three objects with properties about cats.
Destructuring in Objects Unlike in arrays where we can use any variable name to unpack the element, objects allow just the use of the name of the stored data. Interestingly, we can manipulate and assign a variable name to the data we want to get from the object.
Summary. JavaScript destructuring, nested and otherwise, is a nice shorthand to allow us to quickly define variables from values in a collection, object, or array. We can use it with rest syntax to assign remaining elements a variable. We can rename the elements that we pull out to a variable name of our choosing.
You can adjust the variable name to an identifier other than defined innerData
; use .map()
or JSON.stringify()
, JSON.parse()
to filter title
property from innerData
objects
var {title, titles = data.innerData.map(o => ({title:o.title}))} = data;
to maintain innerData
variable name you can use array destructuring of object
var [title, innerData] = [data.title, data.innerData.map(o => ({title:o.title}))];
using JSON.stringify()
, JSON.parse()
var [title, innerData] = JSON.parse(JSON.stringify([data.title, data.innerData], ["title"]));
Edit
If requirement is to create an array containing all title
properties within data
you can use JSON.stringify()
with replacer array set to ["title"]
, JSON.parse()
, spread element
var data = {
title: "title1",
bar: "asdf",
innerData: [
{
title: "inner-title1",
foo: "asdf"
},
{
title: "inner-title2",
foo: "asdf"
}
]
};
var innerData = JSON.parse(JSON.stringify([data, ...data.innerData], ["title"]))
console.log(innerData);
Your destructuring doesn't do what you think.
var { title, innerData: [ { title} ] } = data;
is (essentially) equivalent to
var title = data.title;
var title = data.innerData[0].title;
Destructuring pulls out individual values, it will not map through the array for you. You'll need to do that manually if that is what you want.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With