JS递归怎么实现这道题目?

新手上路,请多包涵

JS递归怎么实现这道题目?

看到一道面试题,想用递归实现

相关代码

let a = {
value: 1,
children: [{
value: 2,
children: [{
value: 3,
children: [{
value: 4,
children: [{
value: 5
}]
}]
}]
}]
};
let b = func(a);
// 要求b的结构如下
[{ value: 1 },
{ value: 2 },
{ value: 3 },
{ value: 4 },
{ value: 5 }]

请问func如何实现?

阅读 3.1k
6 个回答
let a = {
      value: 1,
      children: [
        {
          value: 2,
          children: [
            {
              value: 3,
              children: [
                {
                  value: 4,
                  children: [
                    {
                      value: 5
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    };
    const func = obj => {
      let res = [{ value: obj.value }];
      if (obj.children)
        res = [
          ...res,
          ...obj.children.reduce((a, b) => {
            return [...a, ...func(b)];
          }, [])
        ];
      return res;
    };
    let b = func(a);
    console.log(b);

简单点,代码简单点:

function treeToList ({ value, children }, result = []) {
  result.push({ value })
  children && children.forEach(node => treeToList(node, result))
  return result
}

测试:

const result = treeToList(a)

这道题思路上使用递归没有问题。个人觉得这么简单的题用递归有点杀猪用牛刀了。
while循环实现:

function flatObject2Array(object){
    let result = [];
    while(object.children){
        let { value } = object;
        result.push({
            value
        });
        object = object.children[0];
    }
    return result;
} 
// => [{"value":1},{"value":2},{"value":3},{"value":4},{"value":5}]
let b = func(a);

function func (data) {
  var res = []
  if(getType(data) === 'Object') {
    res.push({ value: data.value })
    deepArray(data.children)
  }

  function deepArray (list) {
    if(getType(list) === 'Array') {
      for(var a = 0; a < list.length; a++) {
        if(getType(list[a]) !== 'Object') continue;
        res.push({ value: list[a].value })
        deepArray(list[a].children)
      }
    }
  }
  return res;
}

function getType (data) {
  return Object.prototype.toString.call(data).slice(8, -1)
}

如果对结果不是严格要求一致的话,这样就行。

function func (input = {}) {
  const items = [input];
  for (const { children = [] } of items) {
    items.push(...children);
  }
  return items;
}

如果结果数据是需要序列化的,那么额外地清理无用的children

function func (input = {}) {
  const items = [input];
  for (const item of items) {
    if (Array.isArray(item.children)) {
      items.push(...item.children);
    }
    delete item.children;
  }
  return items;
}
新手上路,请多包涵
function fun(data) {
    let resultArr = [];
    if (data.value) {
        resultArr = resultArr.concat([{value:
        data.value}])
    };
    if (data.children) {
        resultArr = resultArr.concat(...
        (data.children.map(item => fun(item))))
    };
    return resultArr
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题