构建级联列表的问题

problems building cascading lists

本文关键字:问题 列表 级联 构建      更新时间:2023-09-26

我有一个json来自服务器(不能改变),我需要建立一个嵌套的无序列表菜单。

这里是jsFiddle - warning!运行需要很长时间,这只是示例数据-实际数据要大得多。

不知何故,它搞砸了,我结束了许多东西不合适,它需要永远运行。

代码:

$.each(jData, function (k, v) {
    var vendor = JSON.stringify(k);
    vendor = vendor.replace(/"/g, '');
    var vendorRow = '<li data-vendor="' + vendor + '" class="listItem v">' + vendor + '</li>';
    $('ul#vendors').append(vendorRow);
    $('ul#vendors li[data-vendor="'+vendor+'"]').append('<ul class="sub hide"/>');
    var getArea = _.groupBy(jData[vendor], 'area');
    $.each(getArea, function(k, v) {
        var area = JSON.stringify(k);
        area = area.replace(/"/g,'');
        var thisArea = '<li data-area="'+area+'" class="listItem a">'+area+'</li>';
        $('ul#vendors li[data-vendor="'+vendor+'"] ul.sub').append(thisArea);
        $('ul#vendors li[data-area="'+area+'"]').append('<ul class="sub hide"/>');
        var getRegion = _.groupBy(getArea[area], 'region');
        $.each(getRegion, function(k, v) {
            var region = JSON.stringify(k);
            region = region.replace(/"/g,'');
            var thisRegion = '<li data-region="'+region+'" class="listItem a">'+region+'</li>';
            $('ul#vendors li[data-area="'+area+'"] ul.sub').append(thisRegion);
            $('ul#vendors li[data-region="'+region+'"]').append('<ul class="sub hide"/>');
            var getMarket = _.groupBy(getRegion[region], 'market');
            $.each(getMarket, function(k, v) {
                var market = JSON.stringify(k);
                market = market.replace(/"/g,'');
                var thisMarket = '<li data-market="'+market+'" class="listItem m">'+market+'</li>';
                $('ul#vendors li[data-region="'+region+'"] ul.sub').append(thisMarket);
                $('ul#vendors li[data-market="'+market+'"]').append('<ul class="sub hide"/>');
                var getSwitch = _.groupBy(getMarket[market], 'switch');
                $.each(getSwitch, function(k, v) {
                    var vSwitch = JSON.stringify(k);
                    vSwitch = vSwitch.replace(/"/g,'');
                    var thisSwitch = '<li data-switch="'+vSwitch+'" class="listItem s">'+vSwitch+'</li>';
                    $('ul#vendors li[data-market="'+market+'"] ul.sub').append(thisSwitch);
                });
            });
        });
    });
});

示例输出:

<div id="chartWizard">
    <ul id="vendors">
        <li class="listItem v" data-vendor="levdore">
            levdore
            <ul class="sub hide">
                <li class="listItem a" data-area="Midwest">
                    Midwest
                    <ul class="sub hide">...</ul>
                    <ul class="sub hide">...</ul>
                    <ul class="sub hide">...</ul>
                </li>
            </ul>
        </li>
    </ul>
</div>

这个列表似乎在第2个ul处崩溃了。下标为多个ul。

我真的认为使用递归重新编写代码来逻辑地遍历对象是正确的方法。在某个地方,你对对象进行了多次迭代这就是为什么它需要很长时间才能加载。我重新设计了你的例子,这是我想到的。你也许可以进一步熨平它,使它更易于阅读。

工作示例:http://jsfiddle.net/me6SM/9/

doRecursive(jData,null,$('ul#vendors'),0);
function doRecursive(grp,parent,selector,depth){
    $.each(grp, function(k,v) {
        var item = JSON.stringify(k).replace(/"/g,'');
        var element = ['area','region','market','switch'][depth];
        var thisSelector = 'data-' + element + '="'+item+'"';
        var thisItem = $('<li ' + thisSelector + ' class="listItem '+ (element ? element[0] : '') +'">'+item+'</li>');
        selector.append(thisItem);
        var childList = $('<ul class="sub hide"/>');
        thisItem.append(childList);
        if(!element){return;}
        var next = _.groupBy(grp[item], element );
        doRecursive(next,item, childList , depth + 1);
    });
}