我对一般的递归和编程都很陌生,作为一个初学练习,我正在尝试从多维数组中获取数据并从中制作一个简单的缩进树。
假设我有一个嵌套在其中的数组的数组,每个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
答案 0 :(得分:0)
试试这个:
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;
答案 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));