【发布时间】:2016-04-16 15:58:16
【问题描述】:
我有 javascript 数组,其中每个项目都有对父项的引用,并且它们可以循环(循环引用)。示例:
[
{"id": 1, "firstName": "Macko","parentId": 12},
{"id": 2, "firstName": "Jess","parentId": 1},
{"id": 3, "firstName": "Peter","parentId": 1},
{"id": 4, "firstName": "Lisa", "parentId": 1},
{"id": 5, "firstName": "Megan","parentId": 1},
{"id": 6, "firstName": "John", "parentId": 4},
{"id": 7, "firstName": "Joe", "parentId": 4},
{"id": 8, "firstName": "Matthew","parentId": 2},
{"id": 9, "firstName": "Peter","parentId": 2},
{"id": 10, "firstName": "Dio","parentId": 5},
{"id": 11, "firstName": "Hello","parentId": 5},
{"id": 12, "firstName": "Ana", "parentId": 4}
]
我需要根据所选记录创建嵌套数据结构以将其显示在 DOM 中,这是我通过如下递归函数实现的(来源 here)
function getNestedChildren(arr, parent) {
var out = []
for(var i in arr) {
if(arr[i].parent == parent) {
var children = getNestedChildren(arr, arr[i].id)
if(children.length) {
arr[i].children = children
}
out.push(arr[i])
}
}
return out
}
它确实很好用,但不适用于循环数据结构。问题是我需要在函数到达它开始的元素之前停止函数执行。
我怎样才能做到这一点?
【问题讨论】:
-
添加一个参数(例如数组)来保存已访问 ID 的列表,以便您可以检查它并在适当时停止。
-
@Cyb3rFly3r 我试过了,但结果很奇怪或不完整。你能发布一个例子吗?我可能把条件放在错误的地方。
-
不清楚你的预期结果是什么,因为原始代码总是产生一个空数组。
标签: javascript arrays circular-reference