Превращение вложило JSON во вложенный список HTML с JavaScript

Стоит отметить иногда желание ненастраиваемых "трудно кодированных" чисел в коде. Существуют много известные включая 0x5F3759DF, который используется в оптимизированном обратном алгоритме квадратного корня.

В редких случаях, где я нахожу потребность использовать такие Магические числа, я установил их как константу в моем коде и документ, почему они используются, как они работают, и куда они произошли из.

5
задан Laurence Gonsalves 31 July 2009 в 10:34
поделиться

3 ответа

Ваш json не подходит для вашей задачи. Некоторые объекты имеют несколько свойств с одинаковым именем («узел»), поэтому они перекрывают друг друга. Вместо этого вы должны использовать массивы узлов. Вот рабочая структура данных и функции, которые могут превратить ее во вложенный список:

<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01//EN"
    "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title></title>
<script type="text/javascript">
function parseNodes(nodes) { // takes a nodes array and turns it into a <ol>
    var ol = document.createElement("OL");
    for(var i=0; i<nodes.length; i++) {
        ol.appendChild(parseNode(nodes[i]));
    }
    return ol;
}

function parseNode(node) { // takes a node object and turns it into a <li>
    var li = document.createElement("LI");
    li.innerHTML = node.title;
    li.className = node.class;
    if(node.nodes) li.appendChild(parseNodes(node.nodes));
    return li;
}

window.jsonData = [{
    "class": "folder",
    "title": "Test Framework",
    "nodes": [{
        "class": "folder",
        "title": "Item 1",
        "nodes": [{
            "class": "folder",
            "title": "Item 1.1",
            "nodes": [{
                "class": "file",
                "title": "Item 1.1.a"
            }]
        },
        {
            "class": "folder",
            "title": "Item 1.2",
            "nodes": [{
                "class": "file",
                "title": "Item 1.2.a"
            },
            {
                "class": "file",
                "title": "Item 1.2.b"
            },
            {
                "class": "file",
                "title": "Item 1.2.c"
            }]
        },
        {
            "class": "folder",
            "title": "Item 1.3",
            "nodes": [{
                "class": "folder",
                "title": "Item 1.3.a",
                "nodes": [{
                    "class": "file",
                    "title": "Item 1.3.a.i"
                },
                {
                    "class": "file",
                    "title": "Item 1.3.a.ii"
                }]
            }]
        }]
    },
    {
        "class": "folder",
        "title": "Item 2",
        "nodes": [{
            "class": "file",
            "title": "item 2.a"
        },
        {
            "class": "file",
            "title": "Item 2.b"
        }]
    }]
}];

</script>
</head>
<body>
    <input type="button" 
    onclick="document.body.appendChild(parseNodes(jsonData))"
    value="go" />
</body>
</html>

И я могу добавить этот CSS, чтобы нумерация элементов соответствовала заголовкам узлов:)

<style type="text/css">
ol { list-style-type: none }
ol ol { list-style-type: decimal }
ol ol ol { list-style-type: decimal }
ol ol ol ol { list-style-type: lower-alpha }
ol ol ol ol ol { list-style-type: lower-roman }
</style>

Посмотрите это в действии.

10
ответ дан 13 December 2019 в 19:32
поделиться

Вот довольно простой код, который создает элемент

    для каждого объекта и элемент
  • для каждой части. . Вы можете добавить быструю проверку для проверки дочерней переменной на такие вещи, как "class" , если вы хотите добавить особый случай.

    function jsonToHtmlList(json) {
        return objToHtmlList(JSON.parse(json));
    }
    
    function objToHtmlList(obj) {
        if (obj instanceof Array) {
            var ol = document.createElement('ol');
            for (var child in obj) {
                var li = document.createElement('li');
                li.appendChild(objToHtmlList(obj[child]));
                ol.appendChild(li);
            }
            return ol;
        }
        else if (obj instanceof Object && !(obj instanceof String)) {
            var ul = document.createElement('ul');
            for (var child in obj) {
                var li = document.createElement('li');
                li.appendChild(document.createTextNode(child + ": "));
                li.appendChild(objToHtmlList(obj[child]));
                ul.appendChild(li);
            }
            return ul;
        }
        else {
            return document.createTextNode(obj);
        }
    }
    

    Это не будет делать именно то, что вы хотите , потому что ваш JSON не имеет смысла. Объекты в JavaScript и, следовательно, JSON - это карты, поэтому у вас не может быть более одного дочернего элемента с одинаковым именем. Как указывает Седрик, вам нужно превратить несколько «узлов» в массив.

1
ответ дан 13 December 2019 в 19:32
поделиться

Вы можете самостоятельно пройтись по своей структуре json и при необходимости создать соответствующий

  • , но я предлагаю вам реализовать составной шаблон. См. ссылку для получения дополнительной информации

  • 0
    ответ дан 13 December 2019 в 19:32
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: