使用Javascript / jQuery遍历嵌套列表并存储在数组中

我已经看到了几个关于将数组/对象转换为嵌套列表的问题,但我发现我的问题只有一个相关的问题。 我已经尝试了一些方法来访问元素的子元素,但它只会进一步破坏我的代码。

我有一个嵌套的,无序的列表。

  • World
    • The News
  • Sports

目前,它包含3个项目,如下所示:

 -World --The News -Sports 

可以有任意数量的具有不同深度的节点。 我正在尝试将列表存储到包含一些其他信息的数组中。

每个节点根据其出现的顺序获得数字的顺序ID(第一个节点为1,第二个为2),无论深度如何(即World = 1,The News = 2,Sports = 3)。 我还想存储节点父节点的ID(root为0)。 因此,父ID将是:World = 0,The News = 1,Sports = 0。

下面的代码似乎有效,除非列表如上所示。 在这种情况下,它指定新闻= 3及其父= 2(体育)。 出于某种原因,遍历项目(子项)最后到达

    最后,即使它直接在打开

  • 我发现除了一个jQuery解决方案之外的所有解决方案都忽略了深度,即便如此,我还需要实际的父节点ID(我现在根据我是否已经降低了一个级别来保存在堆栈中)。

    为什么会发生这种情况,如何修改我的代码以递归方式浏览列表?

     var count = 0; var pages = []; var parentStack = []; function createNewLevel(items) { var length = items.length; for (var i = 0; i < length; i++) { if (items[i].tagName == 'UL') { parentStack.push(count); createNewLevel($(items[i]).children().get()); parentStack.pop(); } else { ++count; pages.push({ pId: parentStack[parentStack.length - 1], urlStr: $(items[i]).attr('id'), myId: count }); } } } createNewLevel($('#sortableSitemap ul').get()); console.log(pages); 

    更新 :这是一个jsFiddle来显示代码是如何工作的(“The News”应该将“World”作为其父节点)。

    我修改了原始代码。 这适用于嵌套列表的所有组合。 我没有使用children().get() ,而是使用了原生的JS子方法。 它将遍历列表中的所有内容,但忽略元素,除非它们是

    • 。 祝好运。

        var count = 0; var pages = []; var parentStack = []; var result = {}; parentStack.push(0); function createNewLevel(obj) { var obj = obj || document.getElementById('sortableSitemap'); if (obj.tagName == 'LI') { ++count; pages.push({ pId: parentStack[parentStack.length - 1], urlStr: obj.id, myId: count }); } if (obj.hasChildNodes()) { var child = obj.firstChild; while (child) { if (child.nodeType === 1) { if (child.tagName == 'UL') { parentStack.push(count); } createNewLevel(child); if (child.tagName == 'UL') { parentStack.pop(); } } child = child.nextSibling; } } } createNewLevel(); 
    Interesting Posts