Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
指向树的标题的Javascript数组_Javascript_Arrays_Ecmascript 6_Tree - Fatal编程技术网

指向树的标题的Javascript数组

指向树的标题的Javascript数组,javascript,arrays,ecmascript-6,tree,Javascript,Arrays,Ecmascript 6,Tree,我正在处理一个HTML标题列表(h2、h3、h4、h5、h6)。 图中描述了这一想法: [ { text: 'Some header', rank: 2, // stays for <h2> }, { text: 'Some another header', rank: 3, // stays for <h3> }, { text: 'A header

我正在处理一个HTML标题列表(h2、h3、h4、h5、h6)。 图中描述了这一想法:

[
    {
        text: 'Some header',
        rank: 2, // stays for <h2>
    },
    {
        text: 'Some another header',
        rank: 3, // stays for <h3>
    },
    {
        text: 'A header with the same rank',
        rank: 3, // stays for <h3>
    },
    {
        text: 'One more subsection header',
        rank: 4, // stays for <h4>
    }
]
以下是我当前的代码:

            function list_to_tree(list) {
                // We go from the end to the beggining
                list = list.reverse();

                let node, nextNode, roots = [], i;

                for (i = 0; i < list.length; i += 1) {
                    node = list[i];
                    nextNode = list[i+1];

                    // If the next one's rank is greater, the current into the next as a child
                    if (nextNode !== undefined && node.rank > nextNode.rank) {
                        list[i+1].children.push(node);
                    } else {
                    // Else it's a root
                        roots.push(node);
                    }
                }

                return roots;
            };
功能列表到目录树(列表){
//我们从最后到最后
list=list.reverse();
让node,nextNode,root=[],i;
对于(i=0;inextNode.rank){
列表[i+1]。子项。推送(节点);
}否则{
//否则它就是根
根推(节点);
}
}
回归根;
};

但它只对第一个h3有效,但第二个h3将作为根。关于如何实现这个目标有什么想法吗?谢谢。

以下是工作功能,以防有人需要它:

            function list_to_tree(list) {
                list = list.reverse();

                let node, currentRank = list[0].rank, i, roots = [];

                for (i = 0; i < list.length; i += 1) {
                    node = list[i];

                    if (node.rank > currentRank) {

                        for (let n = i; n < list.length; n += 1) {
                            if (list[n].rank < node.rank) {
                                list[n].children.unshift(node);
                                break;
                            }
                        }


                    } else {
                        currentRank = node.rank;
                        roots.push(node);
                    }
                }

                return roots.reverse();
            };
功能列表到目录树(列表){
list=list.reverse();
let节点,currentRank=list[0]。秩,i,根=[];
对于(i=0;icurrentRank){
对于(设n=i;n
以下是在有人需要时使用的功能:

            function list_to_tree(list) {
                list = list.reverse();

                let node, currentRank = list[0].rank, i, roots = [];

                for (i = 0; i < list.length; i += 1) {
                    node = list[i];

                    if (node.rank > currentRank) {

                        for (let n = i; n < list.length; n += 1) {
                            if (list[n].rank < node.rank) {
                                list[n].children.unshift(node);
                                break;
                            }
                        }


                    } else {
                        currentRank = node.rank;
                        roots.push(node);
                    }
                }

                return roots.reverse();
            };
功能列表到目录树(列表){
list=list.reverse();
let节点,currentRank=list[0]。秩,i,根=[];
对于(i=0;icurrentRank){
对于(设n=i;n
您可以使用level属性
rank
来指示助手数组中的嵌套位置

然后迭代数据并构建子数组(如果需要)

函数getTree(数组){
变量级别=[{}];
array.forEach(函数(o){
levels.length=o.rank;
级别[o.rank-1]。子级=级别[o.rank-1]。子级| |[];
级别[o.rank-1]。children.push(o);
级别[o.rank]=o;
});
返回级别[0]。子级;
}
var data=[{text:'主标题',秩:1},{text:'子标题',秩:2},{text:'子标题',秩:3},{text:'子标题',秩:2},{text:'子标题',秩:3}];
log(getTree(data))

。作为控制台包装{max height:100%!important;top:0;}
您可以使用level属性
rank
来指示助手数组中的嵌套位置

然后迭代数据并构建子数组(如果需要)

函数getTree(数组){
变量级别=[{}];
array.forEach(函数(o){
levels.length=o.rank;
级别[o.rank-1]。子级=级别[o.rank-1]。子级| |[];
级别[o.rank-1]。children.push(o);
级别[o.rank]=o;
});
返回级别[0]。子级;
}
var data=[{text:'主标题',秩:1},{text:'子标题',秩:2},{text:'子标题',秩:3},{text:'子标题',秩:2},{text:'子标题',秩:3}];
log(getTree(data))

.as console wrapper{max height:100%!important;top:0;}
此解决方案将在不考虑起始排名以及列表的给定顺序的情况下工作。。。它使用你提供的准确数据。。。
var jsonHeaders=
[
{
文本:“某些标题”,
排名:2,//停留时间为
},
{
文本:“其他一些标题”,
排名:3,//停留时间为
},
{
文本:“具有相同排名的标题”,
排名:3,//停留时间为
},
{
文本:“一个或多个小节标题”,
排名:4,//停留时间为
}
];
函数列表到树(列表)
{
var jsonTree=[{}];
list=list.reverse();
对于(i=0,l=list.length;ijson.rank)
{
var jsonTemp=jsonTree[0];
jsonTree[0]=json;
json=jsonTemp;
jsonTree[0]=ranker(jsonTree[0],json);
}
}
返回jsonTree;
}
函数ranker(jsonTree,json)
{
if(jsonTree.children==未定义)
{
jsonTree.children=[];
jsonTree.children.push(json);
}
其他的
if(jsonTree.children[0].ra