我正在使用Node.js,Dust.js模板通过Mongoose填充MongoDB中的值的分层列表。尝试在数据到达模板之前过滤它显然是理想的,但我发现很少帮助我弄清楚如何做到这一点,所以我通过jQuery做客户端。这段代码是一个严重的hackery,所以请原谅!但是,至少对于第一级合并,它是有效的。
我的Mongoose数据填充了按类别和子类别排列的卡片组的向下钻取,层次结构菜单(HTML中的简单文件列表结构)。并非每个套牌都有子类别或相同数量的子类别。这些都嵌入在每个套牌中,因为我真的在这里拥抱noSQL的想法!但是来自MySQL,这绝对不容易在Mongoose中安排。
因为类别和子类别嵌入在每个套牌的JSON中,我需要合并所有类别,然后将子类别1合并到一起,这样套牌就会进入适当的位置,以便快速导航到套牌的数据。
我今天写的代码(因为我说这很可怕!)将合并列表的顶层。运行此代码后,对于具有重复项的顶级类别,它们将合并,并保留所有子项。
我的问题:我想大大改进这段代码。现在我正在为我的4或5级中的每一级创建一个这样的函数,这限制了我一种我不想被限制的方式(如果一个主题确实需要6个级别怎么办?)具体来说,我'我喜欢:
一种合并列表部分的方法,包括子项,递归查看下一级是否有重复的主题。
从底层开始合并是否明智?
正如我所说,通过在呈现模板之前过滤数据可能会更好,但我还没有尝试过这样做。
这是我的代码:
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();
}