从对象制作树

时间:2014-04-15 06:53:55

标签: 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>
  

简化树的结构是改变的,但本质   遗迹。请告诉我。

我试过了,但是数据结构不同

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);
        }
    }
}

它有效,但不正确

2 个答案:

答案 0 :(得分:1)

你可以通过做这样的事情来做到这一点(我使用普通的javascript,因为你没有用jquery或其他任何东西标记问题):

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"}
};

var rootNodes = [];

// create dom elements
var domElements = [];
for(var prop in src) {
    var ul = document.createElement('ul');
    var li = document.createElement('li');
    var span = document.createElement('span');
    span.innerHTML = src[prop].title;
    li.appendChild(span);
    ul.appendChild(li);
    domElements[domElements.length] = ul;
}

// nest elements
for(var i = 0; i < domElements.length; i++) {
    var domElement = domElements[i];
    var dataItem = src[i];
    var children = dataItem.child;
    if(children) {
        for(var j = 0; j < children.length; j++) {
            var childDomElement = domElements[children[j]];
            domElement.firstChild.appendChild(childDomElement);
        }
    } else {
        rootNodes[rootNodes.length] = domElement;
    }
}

// output rootNodes
console.log(rootNodes); // gives the desired output

答案 1 :(得分:1)

你可以这样做。它会生成您想要的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/

相关问题