递归得到所有孩子

时间:2019-02-12 06:57:14

标签: javascript recursion

我需要从嵌套对象递归获取所有子代。 我已经写了一个可以做到这一点的函数(有点),但我认为它可以改进。

如何使其更短更整洁?

我已经包含了用于测试的数据以及我编写的需要改进的功能。

this.state.id

预期输出:

let data = [{ id: 1, child: { id: 2, child: { id: 3, child: { id: 4, child: null } } } }, { id: 5, child: { id: 6, child: null } } ]; // function for (let cat of data) { cat.children = getCategoryChild(cat); console.log(cat.children) } function getCategoryChild(cat) { let t = []; if (cat.child != null) { t.push(cat.child); let y = getCategoryChild(cat.child); if (y.length > 0) { for (let i of y) { t.push(i) } } } return t; }

4 个答案:

答案 0 :(得分:3)

您可以通过检查实际的child属性来采取递归方法

function convert(array) {
    const iter = o => o ? [{ id: o.id }, ...iter(o.child)] : [];
    return array.map(({ id, child }) => ({ id, children: iter(child) }));
}

var data = [{ id: 1, child: { id: 2, child: { id: 3, child: { id: 4, child: null } } } }, { id: 5, child: { id: 6, child: null } }];

console.log(convert(data));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:2)

假设每个类别只有一个孩子

已编辑以遵守预期结果...

function iterChildren(cat) {
  let c = cat, children = [];

  while (c.child) {
    children.push({id: c.child.id});
    c = c.child;
  }

  return {id: cat.id, children: children};
}

let newData = data.map(iterChildren);

答案 2 :(得分:1)

我重新编写了函数。
它会过滤猫,并且仅返回一个对象,其中每个对象的idchild_id

let output = [],
    data = [{
        id: 1,
        child: {
          id: 2,
          child: {
            id: 3,
            child: {
              id: 4,
              child: null
            }
          }
        }
      },
      {
        id: 5,
        child: {
          id: 6,
          child: null
        }
      }
    ];

function getCategoryChild(cat) {
  var t = [{
    id: cat.id,
    child_id: null
    /* HERE you can set, what kind of data should be included to output */
  }]
  if (cat.child) {
    t[0].child_id = cat.child.id
    t = t.concat(getCategoryChild(cat.child))
  }
  return t
}

for (x of data) {
  output=output.concat(getCategoryChild(x))
}

console.log(output)

编辑:假设一只猫可以生更多的孩子,我编辑了代码:

let output = [],
  data = [{
      id: 1,
      child: {
        id: 2,
        child: {
          id: 3,
          child: {
            id: 4,
            child: null
          }
        }
      }
    },
    {
      id: 5,
      child: {
        id: 6,
        child: null
      }
    },
    {
      id: 7,
      child: [
        {
          id: 8,
          child: {
            id: 9,
            child: null
          }
        }, 
        {
          id: 10,
          child: null
        }, 
        {
          id: 11,
          child: null
        }
      ]
    },
  ];

function getCategoryChild(cat) {
  var t = [{
    id: cat.id,
    child_id: []
    /* HERE you can set, what kind of data should be included to output */
  }]
  if (cat.child) {
    if (!(cat.child instanceof Array)) {
      cat.child = [cat.child]
    }
    for (var x of cat.child) {
      t[0].child_id.push(x.id)
      t = t.concat(getCategoryChild(x))
    }
  }
  return t
}

for (x of data) {
  output = output.concat(getCategoryChild(x))
}

console.log(output)

答案 3 :(得分:-2)

data.map(({id,child:c})=>({id,children:[...{*0(){for(;c&&({id}=c);c=c.child)yield{id}}}[0]()]}))