Abed Aarabi
Abed Aarabi

Reputation: 149

javascript push to array in recursive function

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

Answers (2)

HSLM
HSLM

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

Andreas
Andreas

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

Related Questions