Reputation: 149
I have an array for folder structure, the point to iterate over each folder content ({ revit: "revit11" }
) and push it to a new array (newArray).
but the function returns empty!
const dummyArray = [
{
folder: [
{ item: "K07" },
{
folder: [
{ item: "K08" },
{
folder: [
{ item: "K09" },
{ incloued: { revit: "revit02" } },
{
folder: [
{ incloued: { revit: "revit11" } },
{ incloued: { revit: "revit12" } },
],
},
],
},
{ incloued: { revit: "revit05" } },
],
},
{ incloued: { revit: "revit06" } },
],
},
{
folder: [
{ item: "aa" },
{ folder: [{ item: "bb" }, { folder: [{ item: "cc" }] }] },
],
incloued: { revit: "revit07" },
},
];
function test(arr) {
let newArray = []; // i need to return this array as function return.
arr.forEach((element) => {
if (element.folder) {
test(element.folder);
} else if (element.incloued) {
console.log(element.incloued);
newArray.push(element.incloued);
}
});
return newArray;
}
const returnFun= test(dummyArray)
console.log(returnFun) //empty!
Upvotes: 2
Views: 397
Reputation: 2022
The problem is that you didnt reuse the values from the recursive method. so you have to add the result of the recursive method to the newArray like this:
function test(arr) {
let newArray = []; // i need to return this array as function return.
arr.forEach((element) => {
if (element.folder) {
newArray.push(...test(element.folder));
} else if (element.incloued) {
newArray.push(element.incloued);
}
});
return newArray;
}
const dummyArray = [
{
folder: [
{ item: "K07" },
{
folder: [
{ item: "K08" },
{
folder: [
{ item: "K09" },
{ incloued: { revit: "revit02" } },
{
folder: [
{ incloued: { revit: "revit11" } },
{ incloued: { revit: "revit12" } },
],
},
],
},
{ incloued: { revit: "revit05" } },
],
},
{ incloued: { revit: "revit06" } },
],
},
{
folder: [
{ item: "aa" },
{ folder: [{ item: "bb" }, { folder: [{ item: "cc" }] }] },
],
incloued: { revit: "revit07" },
},
];
function test(arr) {
let newArray = []; // i need to return this array as function return.
arr.forEach((element) => {
if (element.folder) {
newArray.push(...test(element.folder));
} else if (element.incloued) {
newArray.push(element.incloued);
}
});
return newArray;
}
const returnFun= test(dummyArray)
console.log(returnFun) //empty!
Upvotes: 2
Reputation: 21911
In case of a "folder" you ignore the return value of test()
if (element.folder) {
test(element.folder);
}
You have to combine the current state of newArray
with the return value:
if (element.folder) {
newArray = newArray.concat(test(element.folder));
}
const dummyArray = [
{
folder: [
{ item: "K07" },
{
folder: [
{ item: "K08" },
{
folder: [
{ item: "K09" },
{ incloued: { revit: "revit02" } },
{
folder: [
{ incloued: { revit: "revit11" } },
{ incloued: { revit: "revit12" } },
],
},
],
},
{ incloued: { revit: "revit05" } },
],
},
{ incloued: { revit: "revit06" } },
],
},
{
folder: [
{ item: "aa" },
{ folder: [{ item: "bb" }, { folder: [{ item: "cc" }] }] },
],
incloued: { revit: "revit07" },
},
];
function test(arr) {
let newArray = [];
arr.forEach((element) => {
if (element.folder) {
newArray = newArray.concat(test(element.folder)); // store the result of "inner folders"
} else if (element.incloued) {
console.log(element.incloued);
newArray.push(element.incloued);
}
});
return newArray;
}
const returnFun = test(dummyArray);
console.log(returnFun);
Upvotes: 4