如何合并具有相同类别但不同子类的列表部分,Jquery

时间:2013-04-22 23:37:14

标签: jquery node.js list mongoose dust.js

我正在使用Node.js,Dust.js模板通过Mongoose填充MongoDB中的值的分层列表。尝试在数据到达模板之前过滤它显然是理想的,但我发现很少帮助我弄清楚如何做到这一点,所以我通过jQuery做客户端。这段代码是一个严重的hackery,所以请原谅!但是,至少对于第一级合并,它是有效的。

我的Mongoose数据填充了按类别和子类别排列的卡片组的向下钻取,层次结构菜单(HTML中的简单文件列表结构)。并非每个套牌都有子类别或相同数量的子类别。这些都嵌入在每个套牌中,因为我真的在这里拥抱noSQL的想法!但是来自MySQL,这绝对不容易在Mongoose中安排。

因为类别和子类别嵌入在每个套牌的JSON中,我需要合并所有类别,然后将子类别1合并到一起,这样套牌就会进入适当的位置,以便快速导航到套牌的数据。

我今天写的代码(因为我说这很可怕!)将合并列表的顶层。运行此代码后,对于具有重复项的顶级类别,它们将合并,并保留所有子项。

我的问题:我想大大改进这段代码。现在我正在为我的4或5级中的每一级创建一个这样的函数,这限制了我一种我不想被限制的方式(如果一个主题确实需要6个级别怎么办?)具体来说,我'我喜欢:

  1. 一种合并列表部分的方法,包括子项,递归查看下一级是否有重复的主题。

  2. 从底层开始合并是否明智?

  3. 正如我所说,通过在呈现模板之前过滤数据可能会更好,但我还没有尝试过这样做。

    这是我的代码:

    function mergeLevel1() {
    
      var count = 0;  
      var subcatText;
      var subcatTextCurrent;
    
      $.each($("ul.rootlist > li").not("ul li ul a"), function() {
        var firstNode = $(this)
        var nodeText = $("a:first", this).text();
        //toastr.warning('nodeText is ' + nodeText)
    
        $.each($("ul.rootlist > li").not("ul li ul a").not(firstNode), function() {    
          var siblingNode = $(this)
          var siblingText = $("a:first", this).text();
          //toastr.info('running sibling,  siblingText is ' + siblingText)    
    
          if (nodeText == siblingText) {
    
            toastr.info('i found a duplicate for ' + siblingText)   
            siblingNode.children().find('li').each(function(){
              if (count == 0) {
                subcatText = $(this).text(); 
              }
              subcatTextCurrent = $(this).text(); 
              count++       
    
              toastr.warning("found children of a duplicate " + $(this).text())
              //var targetNode = $("a:first", theNode).text()
    
              toastr.info('try appending to ' + '#'+siblingText+'_ul'+'_'+subcatText)
              if (count > 1) {
                toastr.error('moving node!')
                $(this).appendTo('#'+siblingText+'_ul_'+subcatText);
    
              }
            })
          }
        });
    
        removeEmpties();    
    
      });
    
      // end merge level 1
    }
    
    function removeEmpties() {
    $('ul:empty').parent().remove();
    }
    

0 个答案:

没有答案