说我有这样一个对象:
{
visited: true,
value: 1,
children: [
{
visited: true,
value: 2,
children: [
{
visited: true,
value: 5,
children: []
},
{
visited: false,
value: 6,
children: []
},
{
visited: false,
value: 7,
children: []
},
]
},
{
visited: false,
value: 3,
children: []
},
{
visited: false,
value: 4,
children: []
},
]
}
有没有一种简单的方法可以遍历这个而不使用任何JS框架来最终返回3?
我编写了一个递归函数来检查每个级别中{visited:true}的对象,然后进一步向下钻取,直到我找到没有子节点的被访问节点。我只是想知道是否有任何优化我可以应用于此?
答案 0 :(得分:0)
这是一个迭代函数。它假设被访问节点都处于父子关系中,在树中形成一个唯一路径。作为奖励,它返回被访问节点的值。访问节点的数量当然是该数组的长度:
function collectVisited(child) {
var data, values = [];
while ((data = child).visited) {
child = {};
values.push(data.value);
for (child of data.children) {
if (child.visited) break;
}
}
return values;
}
// Sample data
var data = {
visited: true,
value: 1,
children: [
{
visited: true,
value: 2,
children: [
{
visited: true,
value: 5,
children: []
},
{
visited: false,
value: 6,
children: []
},
{
visited: false,
value: 7,
children: []
},
]
},
{
visited: false,
value: 3,
children: []
},
{
visited: false,
value: 4,
children: []
},
]
};
var values = collectVisited(data);
console.log(values.length);
console.log(values);

答案 1 :(得分:0)
我并不是说这是最好/最快/最有效的解决方案。
const object = [{...}]; // put the object you provided in the array
console.log(count(object)); // returns 3
function count(root) {
return root.children.length? 1 + Math.max(...root.children.map(item => count(item))) : 1;
}
或者,如果这会伤害你的眼睛......:
function count(root) {
if(root.children.length) {
return 1 + Math.max(...root.children.map(item => count(item)));
} else return 1;
}
我很好奇你是如何完成递归函数的。我正在等待评论。