如何在JavaScript中找到受访节点的深度?

时间:2016-06-07 19:04:26

标签: javascript json

说我有这样一个对象:

{
  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}的对象,然后进一步向下钻取,直到我找到没有子节点的被访问节点。我只是想知道是否有任何优化我可以应用于此?

2 个答案:

答案 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;
}

我很好奇你是如何完成递归函数的。我正在等待评论。