我正在尝试使用两个数组创建一个树 - 第一个数组包含需要转换为层次结构/树/嵌套数组的整数,第二个数组包含触发分支的数字。
我已经成功地将第一个数组切换为分支作为基本测试,但我认为我在正确嵌套数组所需的递归函数makeBranch
中缺少一些东西。
这有效:
var sequence = [0, 2, 1, 3, 4, 9, 7, 14, 13, 15, 23, 21, 22, 17, 20, 19, 17, 23, 24, 16, 11, 6, 10, 5],
breaks = [ 0, 17, 23 ];
var tree = [];
for (var i = 0, imax = sequence.length; i<imax; ++i) {
var val = sequence[i];
if (breaks.lastIndexOf(val) != -1) {
tree.push([]);
}
tree[tree.length-1].push(val);
}
console.log(tree); // **** First test - passes
使用相同的数组,它会产生一个非常奇怪的结果:
var tree = makeBranch(sequence, 0, breaks);
console.log(tree); // **** Second test - fails
function makeBranch(sequence, i, breaks) {
var branch = [];
for (var imax = sequence.length; i<imax; ++i) {
var val = sequence[i];
if (breaks.lastIndexOf(val) != -1) {
branch.push( makeBranch(sequence.slice(i+1), i+1, breaks) );
}
branch.push(val);
}
return branch;
}
基本上,我想转动这个数组:
[0, 2, 1, 3, 4, 9, 7, 14, 13, 15, 23, 21, 22, 17, 20, 19, 17, 23, 24, 16, 11, 6, 10, 5]
进入这个(或类似的东西):
[0, 2, 1, 3, 4, 9, 7, 14, 13, 15, [23, 21, 22, [17, 20, 19], [17]], [23, 24, 16, 11, 6, 10, 5]]
任何帮助都将不胜感激。
答案 0 :(得分:0)
var tree = function (seq, breaks) {
var res = [], n;
for(var i = 0; i < seq.length; ) {
if(breaks.indexOf(seq[i]) != -1) {
for(var j = i+1; j < seq.length; j++) {
if(breaks.indexOf(seq[j]) != -1) {
break;
}
}
n = j;
var branch = tree(seq.slice(i+1, n), breaks);
branch.unshift(seq[i]);
res.push(branch);
i+=branch.length;
} else {
res.push(seq[i]);
i++;
}
}
return res;
}
tree([0, 2, 1, 3, 4, 9, 7, 14, 13, 15, 23, 21, 22, 17, 20, 19, 17, 23, 24, 16, 11, 6, 10, 5], [0,17,23])
[[0, 2, 1, 3, 4, 9, 7, 14, 13, 15], [23, 21, 22], [17, 20, 19], [17], [23, 24, 16, 11, 6, 10, 5]]