How to destructure all of the objects from the nested arrays?
To do that, you'd have to know how many elements were in the arrays, so you knew how many elements to use in your destructuring pattern. But your arrays are of varying length, so you can't do that.
Instead, just grab the arrays themselves, then (if needed) do some destructuring when you use those arrays:
for (const { name1, parts } of courses) {
console.log(`${name1}:`);
for (const {name, exercises} of parts) {
console.log(`* ${name}: ${exercises}`);
}
}
const courses = [ { name1: "Half Stack application developm", id: 1, parts: [ { name: "Fundamentals of React", exercises: 10, id: 1 }, { name: "Using props to pass data", exercises: 7, id: 2 }, { name: "State of a component", exercises: 14, id: 3 }, { name: "Redux", exercises: 11, id: 4 }, ], }, { name1: "Node.js", id: 2, parts: [ { name: "Routing", exercises: 3, id: 1 }, { name: "Middlewares", exercises: 7, id: 2 }, ], }, ];
for (const { name1, parts } of courses) {
console.log(`${name1}:`);
for (const {name, exercises} of parts) {
console.log(`* ${name}: ${exercises}`);
}
}
.as-console-wrapper {
max-height: 100% !important;
}
That's just one example of how you'd use the parts
array, of course. You could do anything with it you liked, such as creating a string:
for (const { name1, parts } of courses) {
const partsString = parts.map(({name, exercises}) =>
`${name}: ${exercises}`
).join(", ");
console.log(`${name1}: ${partsString}`);
}
const courses = [ { name1: "Half Stack application developm", id: 1, parts: [ { name: "Fundamentals of React", exercises: 10, id: 1 }, { name: "Using props to pass data", exercises: 7, id: 2 }, { name: "State of a component", exercises: 14, id: 3 }, { name: "Redux", exercises: 11, id: 4 }, ], }, { name1: "Node.js", id: 2, parts: [ { name: "Routing", exercises: 3, id: 1 }, { name: "Middlewares", exercises: 7, id: 2 }, ], }, ];
for (const { name1, parts } of courses) {
const partsString = parts.map(({name, exercises}) =>
`${name}: ${exercises}`
).join(", ");
console.log(`${name1}: ${partsString}`);
}
.as-console-wrapper {
max-height: 100% !important;
}
Or you can use map
to create a new array (perhaps with the course name, part name, and exercises) to pass to some other code (such as a React component, as you mentioned in a comment):
const result = courses.map(({ name1, parts }) =>
parts.map(({ name, exercises }) => ({
course: name1,
name,
exercises,
}))
);
const courses = [ { name1: "Half Stack application developm", id: 1, parts: [ { name: "Fundamentals of React", exercises: 10, id: 1 }, { name: "Using props to pass data", exercises: 7, id: 2 }, { name: "State of a component", exercises: 14, id: 3 }, { name: "Redux", exercises: 11, id: 4 }, ], }, { name1: "Node.js", id: 2, parts: [ { name: "Routing", exercises: 3, id: 1 }, { name: "Middlewares", exercises: 7, id: 2 }, ], }, ];
const result = courses.map(({ name1, parts }) =>
parts.map(({ name, exercises }) => ({
course: name1,
name,
exercises,
}))
);
console.log(JSON.stringify(result, null, 4));
.as-console-wrapper {
max-height: 100% !important;
}
Or with map
, again, create an array of objects with nested parts:
const result = courses.map(({ name1, parts }) => ({
course: name1,
parts: parts.map(({ name, exercises }) => ({ name, exercises })),
}));
const courses = [ { name1: "Half Stack application developm", id: 1, parts: [ { name: "Fundamentals of React", exercises: 10, id: 1 }, { name: "Using props to pass data", exercises: 7, id: 2 }, { name: "State of a component", exercises: 14, id: 3 }, { name: "Redux", exercises: 11, id: 4 }, ], }, { name1: "Node.js", id: 2, parts: [ { name: "Routing", exercises: 3, id: 1 }, { name: "Middlewares", exercises: 7, id: 2 }, ], }, ];
const result = courses.map(({ name1, parts }) => ({
course: name1,
parts: parts.map(({ name, exercises }) => ({ name, exercises })),
}));
console.log(JSON.stringify(result, null, 4));
.as-console-wrapper {
max-height: 100% !important;
}
Or tweak/adjust as necessary.