Charlote22
Charlote22

Reputation: 1145

Return an array of objects from a recursive function in Javascript

I'm working on recursive functions.

I must push all objects that have the key "data: true" in an array. The console.log in the middle of my function gives me all those objects in separate arrays.

But I can't return an array with the objects at the end. What am I doing wrong? Thanks

const entries = {
  root: {
    data: true,
    key: "root",
    text: "some text"
  },
  test: {
    one: {
      two: {
        data: true,
        key: "test.one.two",
        text: "some text.again"
      },
      three: {
        data: true,
        key: "test.one.three",
        text: "some.more.text"
      }
    },
    other: {
      data: true,
      key: "test3",
      text: "sometext.text"
    }
  },
  a: {
    b: {
      data: true,
      key: "a.b",
      text: "a.b.text"
    },
    c: {
      d: {
        data: true,
        key: "a.c.d",
        text: "some.a.c.d"
      }
    }
  }
};


function recursiveFunc(data) {
  let tab = [];
  for (let property in data) {
    if (data.hasOwnProperty(property)) {
      if (data[property].data === true) {
        tab.push(data[property]);
        console.log("t", tab);
      } else {
        recursiveFunc(data[property])
      }
    }
  }
  return tab
}

console.log(recursiveFunc(entries));

Upvotes: 2

Views: 8659

Answers (3)

Marius
Marius

Reputation: 1574

You could use a global variable.

const entries = { ... };


var tab = [];

function getTab(data) {
    tab = [];
    recursiveFunc(data);
    return tab;
}
function recursiveFunc(data) {
  for (let property in data) {
    if (data.hasOwnProperty(property) && typeof data[property] === "object") {
      if (data[property].data === true) {
        tab.push(data[property]);
      } else {
        recursiveFunc(data[property])
      }
    }
  }
}

getTab(entries);

Upvotes: 0

Zim
Zim

Reputation: 1483

You can pass an array as second argument that will act as an accumulator.

Plus, I fixed your function that loops infinitely when data = false:

function recursiveFunc(data, acc) {
  for (let property in data) {
    if (data.hasOwnProperty(property) && typeof data[property] === "object") {

      var current = data[property];

      if (current.data === true) {
        acc.push(current);
      } else {
        recursiveFunc(current, acc)
      }

    }
  }
}

Usage:

var results = [];
recursiveFunc(entries, results);
console.log(results);

Upvotes: 1

osiris85
osiris85

Reputation: 206

Add tab.concat() on the recursive call for join the items returned by the recursive fn.

const entries = {
  root: {
    data: true,
    key: "root",
    text: "some text"
  },
  test: {
    one: {
      two: {
        data: true,
        key: "test.one.two",
        text: "some text.again"
      },
      three: {
        data: true,
        key: "test.one.three",
        text: "some.more.text"
      }
    },
    other: {
      data: true,
      key: "test3",
      text: "sometext.text"
    }
  },
  a: {
    b: {
      data: true,
      key: "a.b",
      text: "a.b.text"
    },
    c: {
      d: {
        data: true,
        key: "a.c.d",
        text: "some.a.c.d"
      }
    }
  }
};


function recursiveFunc(data) {
  let tab = [];
  for (let property in data) {
    if (data.hasOwnProperty(property)) {
      if (data[property].data === true) {
        tab.push(data[property]);
        console.log("t", tab);
      } else { 
        tab = tab.concat(recursiveFunc(data[property]));
      }
    } 
  } 
  return tab
}
console.log(recursiveFunc(entries));

Upvotes: 7

Related Questions