Возврат массива объектов из рекурсивной функции в Javascript - PullRequest
0 голосов
/ 22 ноября 2018

Я работаю над рекурсивными функциями.

Я должен поместить все объекты, которые имеют ключ "data: true" в массиве.Console.log в середине моей функции дает мне все эти объекты в отдельных массивах.

Но я не могу вернуть массив с объектами в конце.Что я делаю неправильно?Спасибо

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));

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Вы можете передать массив в качестве второго аргумента, который будет действовать как аккумулятор.

Плюс, я исправил вашу функцию, которая работает бесконечно, когда 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)
      }

    }
  }
}

Использование:

var results = [];
recursiveFunc(entries, results);
console.log(results);
0 голосов
/ 22 ноября 2018

Вы можете использовать глобальную переменную.

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);
0 голосов
/ 22 ноября 2018

Добавьте tab.concat() к рекурсивному вызову для объединения элементов, возвращаемых рекурсивным 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...