使用递归从数组中创建缩进列表

时间:2017-05-04 21:01:24

标签: javascript arrays recursion tree

我对一般的递归和编程都很陌生,作为一个初学练习,我正在尝试从多维数组中获取数据并从中制作一个简单的缩进树。

假设我有一个嵌套在其中的数组的数组,每个0索引字符串是一个标题或者数组继续存在,另一个是子标题等。

arr = ['Navigation','Homepage',['Social','Facebook','Twitter'],'Projects','Experience',['Gaming','Steam',['Streaming','Twitch','Hitbox']]];

在这种情况下,导航是一切的主要标题,社交是Facebook和Twitter的标题。项目和经验只是他们标题中的孩子,应该与社交一样。

这是我提出的代码:

function tree(tarr) {
    for (var i = 0; i < tarr.length; i++) {
      if (typeof tarr[i] == 'string') {
        if (i == 0) {
          console.log(tarr[i] + ":");
        } else {
          console.log(tarr[i]);
        }
      } else {
        tree(tarr[i]);
      }
    }
  }

tree(arr);

我认为递归在这里至关重要,因此我使用它。此外,我能够在标题中添加冒号,但我找不到一种方法来缩进每个子标题及其子节点的相应数量。

无论如何,我正在努力实现这种结构:

Navigation:
   Homepage
   Social:
      Facebook
      Twitter
   Projects
   Experiment
   Games:
      Steam
      Streaming:
         Twitch
         Hitbox

2 个答案:

答案 0 :(得分:0)

试试这个:

&#13;
&#13;
arr = ['Navigation', 'Homepage', ['Social', 'Facebook', 'Twitter'], 'Projects', 'Experience', ['Gaming', 'Steam', ['Streaming', 'Twitch', 'Hitbox']]];

function print_format(a, intent) {

  a.map((val, index) => {
    if (Array.isArray(val)) {
      print_format(val, intent + 4)
    } else {
      if (index === 0) {
        console.log(" ".repeat(intent) + val + ":")
      } else {
        // Make sure to use same constant value(4), which is used to increment intent
        console.log(" ".repeat(intent + 4) + val)
      }
    }
  })
}

print_format(arr, 0)
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您的数据结构很奇怪,但我从它的理解中得知,您可能会想出一个递归函数来处理它,如下所示;

var arr = ['Navigation','Homepage',['Social','Facebook','Twitter'],'Projects','Experience',['Gaming','Steam',['Streaming','Twitch','Hitbox']]],
makeObj = a => a.reduce((r,p,i) => a.length ? i ? Array.isArray(p) ? (r[a[0]] = Object.assign(r[a[0]], makeObj(p)), r)
                                                                   : (r[a[0]] = Object.assign(r[a[0]], {[p]:null}), r)
                                                : (r[a[0]] = {}, r)
                                            : r, {});
console.log(makeObj(arr));