如何在javascript中使用2个一维数组创建层次结构树?

时间:2015-03-19 04:29:18

标签: javascript arrays recursion

我正在尝试使用两个数组创建一个树 - 第一个数组包含需要转换为层次结构/树/嵌套数组的整数,第二个数组包含触发分支的数字。

我已经成功地将第一个数组切换为分支作为基本测试,但我认为我在正确嵌套数组所需的递归函数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]]

任何帮助都将不胜感激。

1 个答案:

答案 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]]