【发布时间】:2017-11-19 22:10:47
【问题描述】:
我有如下数据:
var data = {
itemOne:{id:"itemOne",parent:false},
itemTwo:{id:"itemTwo",parent:"itemOne"},
itemThree:{id:"itemThree",parent:"itemTwo"},
itemFour:{id:"itemFour",parent:"itemTwo"},
itemFive:{id:"itemFive",parent:false},
itemSix:{id:"itemSix",parent:"itemOne"},
itemSeven:{id:"itemSeven",parent:"itemFive"},
};
因此,主数据对象中的每个子对象都指定了其 ID 和父对象,如果没有父对象,则将其标记为 false。我需要做的是把它输出到一个多级无序列表中,所以它应该是这样的:
- 项目一
- 项目二
- 第三项
- 第四项
- 第六条
- 项目二
- 第七项
现在此数据是一个简化的样本,但该列表的深度可能超过 3 层并以随机顺序显示。我知道解决方案将涉及某种递归,但我不知道该怎么做。到目前为止,我已经构建了以下内容:
var myList = '<ul>';
for(item in data){
var id = data[item]['id'];
var parent = data[item]['parent'];
if(parent == false){
myList += '<li>'+id+'</li>';
//no idea what to do here
}
}
myList += '</ul>';
更新:一些答案已经把我的数据对象变成了一个数组。重要的是数据保持为对象,因为这是我提供的值,我无法更改。到目前为止,我的想法是我可能需要先将我的数据转换为多级对象结构,然后在完成后将多级对象转换为无序列表。这样一来,数据就可以更容易地最初被操纵到适当的层次结构中。
【问题讨论】:
-
你应该使用 dfs serach。
-
为什么你不只是用子属性或其他东西嵌套对象?而且您需要一个函数,您将在其内部调用它以使其递归。
-
对象中的键/值对没有排序。如果要强制/保留顺序,则需要使用数组。
-
@Teemoh 不幸的是,我无法控制数据的原始格式,因为它是由 WordPress 提供的。但我明白你在说什么。
-
@torazaburo 是的,明白了。我对顺序不太挑剔,只要层次结构正确就可以了。
标签: javascript list object recursion