javascript - 从 JavaScript 对象创建嵌套无序列表(可以是 n 层深)

标签 javascript arrays

考虑到下面列出的 JSON 树结构(可以是 n 层深),我想创建一个嵌套的无序列表

var data = [{
        'text': 'Subjects',
        'data': [{
            'text': 'Geography',
            'data': []
        }, {
            'text': 'History',
            'data': [{
                'text': 'Ancient History',
                'data': []
            }]
        }]
    }, {
        'text': 'Sports',
        'data': []
    }, {
        'text': 'Music',
        'data': []
    }];

数据可以嵌套“n”层。您可以将“数据”包含在“数据”中,而“数据”又包含在另一个“数据”中,依此类推。

输出应该是这样的

<ul>
<li>Subjects
    <ul>
        <li>Geography</li>
        <li>History
            <ul>
                <li>Ancient History
                </li>
            </ul>
        </li>
    </ul>
</li>
<li>Sports
</li>
<li>Music
</li>

function json_tree(object) {
    var json = "<ul>";
    for (prop in object) {
        var value = object[prop];
        switch (typeof(value)) {
            case "object":
                json += "<li>" + value.text + json_tree(value) + "</li>";
                break;
            default:
                json += "<li>" + value.text + "</li>";
        }
    }
    return json + "</ul>";
}

我尝试使用上面的代码,但这不会产生所需的结果。

最佳答案

您当前的逻辑将在 for...in 循环中找到以下键:

0
'text'
'data'

检索 obj[0] 的文本属性按预期工作,但是:

obj['text'].text === undefined
obj['data'].text === undefined

这会给你带来你所看到的糟糕结果( jsFiddle ):

Subjects
    undefined
    undefined
        Geography
            undefined
            undefined
        History
            undefined
            undefined
            Ancient History
                undefined
                undefined
Sports
    undefined
    undefined
Music
    undefined
    undefined

我已更改迭代器以使用简单的 for 循环而不是 for...in。

此外,您可以简化检查,仅查找当前索引对象中的数据长度,以确定是否需要再次递归到 json_tree:

function json_tree(data) {
    var json = "<ul>";

    for(var i = 0; i < data.length; ++i) {
        json = json + "<li>" + data[i].text;
        if(data[i].data.length) {
            json = json + json_tree(data[i].data);
        }
        json = json + "</li>";
    }
    return json + "</ul>";
}

demo fiddle

关于javascript - 从 JavaScript 对象创建嵌套无序列表(可以是 n 层深),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25552843/

相关文章:

javascript - "a"标签的 href 在 ul li 中不起作用

javascript - 使用 jQuery 打开链接并自动滚动到特定的 div

javascript - 使用 jquery 淡入/淡出 javascript 不起作用

javascript - 数组 - 查找序列中缺失的数字

javascript - 使用 PhoneGap 和 jQuery 时更改 anchor 标记文本

javascript - 在 JS 中将 Tick 转换为日期

javascript通过相同的键查找对象并将它们合并

javascript - 根据元素的数字顺序合并两个数组

Java队列和多维数组

php - 如何将结果从 MySQL 存储到 PHP 数组?