javascript - 从对象创建树

标签 javascript html tree

对象:

    var src = {
    0: {child: [1], title: "Books"},
    1: {child: [2,3], title: "Programming"},
    2: {title: "Languages"},
    3: {child: [4,5],title: "Databases"},
    4: {title: "MongoDB"},
    5: {title: "dbm"}
};

如何以该对象的形式构建一棵树

<div id="tree">
    <ul>
        <li id="0">
            <span>Books</span>
            <ul>
                <li id="1">
                    <span>Programming</span>
                    <ul>
                        <li id="2">
                            <span>Languages</span>
                        </li>
                        <li id="3">
                            <span>Databases</span>
                            <ul>
                                <li id="4">
                                    <span>MongoDB</span>
                                </li>
                                <li id="5">
                                    <span>dbm</span>
                                </li>
                            </ul>
                        </li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
</div>

To simplify the structure of the tree is changed, but the essence remains. Please tell me.

我尝试过,但数据结构不同

var data = {
    0: {title: "Books"},
    1: {pid: 0, title: "Programming"},
    2: {pid: 1, title: "Languages", ch: 0},
    3: {pid: 1, title: "Databases"},
    4: {pid: 3, title: "MongoDB", ch: 0},
    5: {pid: 3, title: "dmb", ch: 0}
};          
    function makeTree(data) {
    var child = [];
    var i = 0;
    for (var key in data) {
        if (data[key].hasOwnProperty('pid')) {
            if (data[key].hasOwnProperty('ch')) {
                child[i] = document.createElement('li');
                child[i].setAttribute('id', key);
                child[i].innerHTML = data[key].title + ' <span></span></li>';
            }
            else {
                child[i] = document.createElement('li');
                child[i].setAttribute('id', key);
                child[i].innerHTML = data[key].title + '<span></span>';
                child[i].innerHTML += '<ol><li id=' + key + '>' + data[key].title + '<span></span></li></ol>';
            }
            document.getElementById(data[key].pid + "").appendChild(child[i]);
            i++;
        }
        else {
            var li = document.createElement('li');
            li.setAttribute('id', key);
            li.innerHTML = data[key].title + '<span></span>'
            tree.appendChild(li);
        }
    }
}

它可以工作,但不正确

最佳答案

你可以这样做。它会生成您想要的 HTML。它从父级到子级递归迭代。

var outputHtml = '<div id="tree">';
function buildTree(parrent)
{
    var currentParent = parrent;
     outputHtml += '<ul>';
     if(parrent === -1)
     {
         outputHtml += '<li id="' + 0 + '">';
         outputHtml += '<span>'+ src[0].title +'</span>';
         buildTree(0);
         outputHtml += '</li>';
     }
    else{
         for(var i = 0, childArray = src[currentParent].child, iLength = childArray.length; i < iLength; ++i)
         {
             outputHtml += '<li id="' + childArray[i]+ '">';
             outputHtml += '<span>'+ src[childArray[i]].title +'</span>';
             if(src[childArray[i]].child)
                 buildTree(childArray[i]);
             outputHtml += '</li>';
         }
    }

     outputHtml += '</ul>';
}
buildTree(-1);
outputHtml += '</div>';
  • 添加开头 div
  • 检查它是否是 root 并添加它,然后调用 buildTree 打印子项。
  • 对于父级的每个子级,打印它。
  • 如果它有子项,请调用 buildTree 来打印它们。
  • 添加结尾 div。

如您所见,它在这里工作正常:

http://jsfiddle.net/ALUVu/1/

关于javascript - 从对象创建树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23076530/

相关文章:

javascript - 附加到列表

javascript - 在 Angular Js 导航栏中将元素右对齐

javascript - 复杂的网站,需要更新与 jQuery 共享类的按钮

Javascript动画内容在和隐藏

c - 如何在 C 中创建节点中具有不同类型值的树?

javascript - React Helm 不覆盖标题和元标记

javascript - 使用javascript onclick更改图像源效果

arrays - 如何有效存储 262144 个变量?多维数组?

python - 使用 nltk 查找祖 parent 节点

javascript - 即使加载 jquery ui 库,$.ui 也是未定义的