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

发布于 2022-09-12 22:20:38 字数 327 浏览 25 评论 0

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如何实现?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

旧情勿念 2022-09-19 22:20:39

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

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;
}
烟花肆意 2022-09-19 22:20:39
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
}
高冷爸爸 2022-09-19 22:20:38
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);
小嗷兮 2022-09-19 22:20:38

简单点,代码简单点:

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

测试:

const result = treeToList(a)
童话 2022-09-19 22:20:38

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

function flatObject2Array(object){
    let result = [];
    while(object.children){
        let { value } = object;
        result.push({
            value
        });
        object = object.children[0];
    }
    return result;
} 
最舍不得你 2022-09-19 22:20:38
// => [{"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)
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文