javascript - 从 JSON 数组 Javascript 创建菜单

标签 javascript html css arrays json

我想从 JSON 数组创建一个菜单

JSON 数组:

[{
    "page_id":"102608802958096849","title":"Submenu 1 1","page_order":1,"parent_id":"305280635460611248","layout":"header","page_url":"submenu-1-1.html"
},{
    "page_id":"207782958260361106","title":"Submenu 2 1","page_order":1,"parent_id":"196241715470310788","layout":"header","page_url":"submenu-2-1.html"
},{
    "page_id":"305280635460611248","title":"Submenu 1","page_order":1,"parent_id":"308333626876055885","layout":"header","page_url":"submenu-1.html"
},{
    "page_id":"308333626876055885","title":"Demo","page_order":1,"parent_id":null,"layout":"header-slider","page_url":"index.html"
},{
    "page_id":"357018431614169959","title":"Not Mega Menu","page_order":1,"parent_id":"756836287653398147","layout":"header","page_url":"not-mega-menu.html"
},{
    "page_id":"363544895956322795","title":"Submenu 2 1 1","page_order":1,"parent_id":"207782958260361106","layout":"header","page_url":"submenu-2-1-1.html"
},{
    "page_id":"130518632716609153","title":"New Page","page_order":2,"parent_id":"756836287653398147","layout":"header","page_url":"new-page.html"
},{
    "page_id":"196241715470310788","title":"Submenu 2","page_order":2,"parent_id":"308333626876055885","layout":"header","page_url":"submenu-2.html"
},{
    "page_id":"520778073299851538","title":"Submenu 2 2","page_order":2,"parent_id":"196241715470310788","layout":"header","page_url":"submenu-2-2.html"
},{
    "page_id":"756836287653398147","title":"Phoenix","page_order":2,"parent_id":null,"layout":"header","page_url":"phoenix.html"
},{
    "page_id":"951287960823231869","title":"Submenu 2 1 2","page_order":2,"parent_id":"207782958260361106","layout":"header","page_url":"submenu-2-1-2.html"
}]

我想要创建的预期菜单如下所示:

HTML:

<ul>
<li>
    <a>Demo</a>
    <div>
        <ul>
            <li>
                <a>Submenu 1</a>
                <div>
                    <ul><li><a>Submenu 1 1</a></li></ul>
                </div>
            </li>
            <li>
                <a>Submenu 2</a>
                <div>
                    <ul>
                        <li>
                            <a>Submenu 2 1</a>
                            <div>
                                <ul>
                                    <li>
                                        <a>Submenu 2 1 1</a>
                                    </li>
                                    <li>
                                        <a>Submenu 2 1 2</a>
                                    </li>
                                </ul>
                            </div>
                        </li>
                        <li>
                            <a>Submenu 2 2</a>
                        </li>
                    </ul>
                </div>
            </li>
        </ul>
    </div>
</li>
<li>
    <a>Phoenix</a>
    <div>
        <ul>
            <li><a>New Page</a></li>
            <li><a>Not Mega Menu</a></li>
        </ul>
    </div>
</li>

注意:

举个例子: "page_id":"102608802958096849","title":"Submenu 1 1","page_order":1,"parent_id":"305280635460611248","layout":"header","page_url":"submenu-1-1.html"

page_id = 102608802958096849(定义菜单id)

title = 子菜单 1 1(标题)

page_order = 1 (menu:nth-child(1))

有什么想法可以从 JSON 数组构建上面的菜单吗?提前致谢

最佳答案

您可以先构建一棵树,然后再渲染所需的结构。

function getTree(array) {
    var o = {};
    array.forEach(a => {
        if (o[a.page_id] && o[a.page_id].children) {
            a.children = o[a.page_id] && o[a.page_id].children;
        }
        o[a.page_id] = a;
        o[a.parent_id] = o[a.parent_id] || {};
        o[a.parent_id].children = o[a.parent_id].children || [];
        o[a.parent_id].children.push(a);
    });
    return o.null.children;
}

function buildMenu(array, target) {
    var ul = document.createElement('ul');

    array.forEach(o => {
        var li = document.createElement('li'),
            a = document.createElement('a'),
            div;

        a.appendChild(document.createTextNode(o.title));
        a.href = o.page_url;
        li.appendChild(a);
        if (o.children) {
            div = document.createElement('div');
            buildMenu(o.children, div);
            li.appendChild(div);
        }
        ul.appendChild(li);
    });
    target.appendChild(ul);
}

var data = [{ page_id: "102608802958096849", title: "Submenu 1 1", page_order: 1, parent_id: "305280635460611248", layout: "header", page_url: "submenu-1-1.html" }, { page_id: "207782958260361106", title: "Submenu 2 1", page_order: 1, parent_id: "196241715470310788", layout: "header", page_url: "submenu-2-1.html" }, { page_id: "305280635460611248", title: "Submenu 1", page_order: 1, parent_id: "308333626876055885", layout: "header", page_url: "submenu-1.html" }, { page_id: "308333626876055885", title: "Demo", page_order: 1, parent_id: null, layout: "header-slider", page_url: "index.html" }, { page_id: "357018431614169959", title: "Not Mega Menu", page_order: 1, parent_id: "756836287653398147", layout: "header", page_url: "not-mega-menu.html" }, { page_id: "363544895956322795", title: "Submenu 2 1 1", page_order: 1, parent_id: "207782958260361106", layout: "header", page_url: "submenu-2-1-1.html" }, { page_id: "130518632716609153", title: "New Page", page_order: 2, parent_id: "756836287653398147", layout: "header", page_url: "new-page.html" }, { page_id: "196241715470310788", title: "Submenu 2", page_order: 2, parent_id: "308333626876055885", layout: "header", page_url: "submenu-2.html" }, { page_id: "520778073299851538", title: "Submenu 2 2", page_order: 2, parent_id: "196241715470310788", layout: "header", page_url: "submenu-2-2.html" }, { page_id: "756836287653398147", title: "Phoenix", page_order: 2, parent_id: null, layout: "header", page_url: "phoenix.html" }, { page_id: "951287960823231869", title: "Submenu 2 1 2", page_order: 2, parent_id: "207782958260361106", layout: "header", page_url: "submenu-2-1-2.html" }],
    tree = getTree(data);

buildMenu(tree, document.body);

console.log(tree);

关于javascript - 从 JSON 数组 Javascript 创建菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50239162/

相关文章:

html - 背景 SVG 不会在 Bootstrap div 列中缩放

html - IE7 对齐表格单元格中按钮旁边的文本

javascript - 了解 Express Node.js 中的虚拟主机

javascript - 如何在 HTML5 和 Javascript 中添加计时器?

html - 如何使用 Bootstrap 表单控件类自动调整内容大小来制作 contenteditable div?

javascript - CSS - 谁能帮我弄清楚我的下拉菜单导航哪里出了问题?

jquery - 你在哪里放置 jquery 以实现平滑滚动?

javascript - 更改 ExtJS Grid/DatePicker 中使用的短/长月份名称

javascript - Javascript 对象属性和数组之间的迭代有什么区别

jquery - Laravel - 重定向回选项卡 Pane