我有这个JSON有效负载,其中每个对象都包含一个ID、名称和子对象数组。在这里,我需要获取所有元素的ID,包括根元素和所有嵌套子元素。
{
"_id": "-1",
"_name": "root",
"_children": [
{
"_id": "1",
"_name": "Child 1",
"_children": [
{
"_id": "1-1",
"_name": "Child 1-1",
"_children": [
{
"_id": "1-1-1",
"_name": "Child 1-1-1",
"_children": [
]
}
]
},
{
"_id": "1-2",
"_name": "Child 1-2",
"_children": [
]
},
{
"_id": "1-3",
"_name": "Child 1-3",
"_children": [
]
}
]
},
{
"_id": "2",
"_name": "Child 2",
"_children": [
{
"_id": "2-2",
"_name": "Child 2-2",
"_children": [
]
}
]
}
]
}我如何遍历它来获得所有子节点和根节点的ID值?
这就是我尝试使用嵌套函数的方法,但它不起作用。
getNestedChildren(arr) {
var out = []
for(var i in arr[0].children) {
out.push(arr[i].id);
if(arr[i].children && arr[i].children.size() > 0) {
var children = this.getNestedChildren(arr[i].children)
}
}发布于 2020-02-09 12:00:23
您可以使用递归,并通过引用修改“结果数组”。
例如,如果嵌套对象存储在变量data中,则:
function addNestedChildrenToArray(obj, resultArray) {
resultArray.push(obj._id);
obj._children.forEach(child => addNestedChildrenToArray(child, resultArray));
}
const resultArray = [];
addNestedChildrenToArray(data, resultArray);
// resultArray now contains the results
console.log(resultArray);发布于 2020-02-06 19:08:19
您可以展平一棵树,然后简单地获取ids。请参阅工作示例here
const tree = {
"_id": "-1",
"_name": "root",
"_children": [
// ...
]
}
function flattenTree(tree) {
if (!tree) {
return [];
}
if (tree._children) {
const result = tree._children.reduce((prev, current) => prev.concat(flattenTree(current)), [tree]);
return result;
} else {
return [tree];
}
}
const plain = flattenTree(tree);
const ids = plain.map(value => value._id);发布于 2020-02-09 12:16:47
这里有一个解决方案,其工作方式基本上与@samdouble的答案相同;将当前节点的ID推送到一个结果数组中,然后递归到该节点的子节点上。
结果数组必须在调用递归函数之前创建,因此为方便起见,可以将其包装在外部函数中;这使得调用者不必创建一个空数组来传递给函数。
interface TreeNode {
_id: string;
_name: string;
_children: TreeNode[];
}
function getIds(data: TreeNode): string[] {
const result: string[] = [];
function helper(node: TreeNode): void {
result.push(node._id);
node._children.forEach(helper);
}
helper(data);
return result;
}Playground Link
https://stackoverflow.com/questions/60090730
复制相似问题