请教一个js对json遍历的问题

clipboard.png
比如说 我想找得id为4,就应该返回 [1,3,4]
想找得id 为9 该返回 [1,3,9]
想找得id为7 改返回 [6,7]

不知道我说明白没有。谢谢解答啊

阅读 3.5k
4 个回答

很多人都在抱怨你没有把代码贴出来,能回答问题的人可都是真心的!
简化版实验原始数据(也供其他人可以验证自己的方案)

var nodes = [
    {
      "id": 1, 
      "children": [
        {
          "id": 3,
          "children": [
            {"id": 4},
            {"id": 9}
          ]
        },
        {
          "id": 10
        },
      ]
    },
    {
      "id": 2
    },
    {
      "id": 6,
      "children" : [
        { "id": 5},
        { "id": 7},
        { "id": 8}
      ]
    }
];

JS查找输出结果

//递归实现
//@leafId  为你要查找的id,
//@nodes   为原始Json数据
//@path    供递归使用,不要赋值
function findPathByLeafId(leafId, nodes, path) {
  if(path === undefined) {
    path = [];
  }
  for(var i = 0; i < nodes.length; i++) {
      var tmpPath = path.concat();
      tmpPath.push(nodes[i].id);
      if(leafId == nodes[i].id) {
         return tmpPath;
      }
      if(nodes[i].children) {
        var findResult = findPathByLeafId(leafId, nodes[i].children, tmpPath);
        if(findResult) {
          return findResult;
        }
      }
  }
}

//用法
console.log(findPathByLeafId(4, nodes));   //输出 [1,3,4]
console.log(findPathByLeafId(9, nodes));   //输出 [1,3,9]
console.log(findPathByLeafId(7, nodes));   //输出 [6,7]

你可以把代码贴出来么……你这样放个图片很难处理啊……

直接递归遍历啊,先校验id是否相同,相同直接return,不同则看是否有children,有则记录下当前层的id并继续向下遍历,无则清空记录并跳过当前的节点,遍历下一个同层节点。

function solution(arr,id){
var ans=[];
var flag=false;
function dps(obj,depth){
    ans[depth]=obj.id;
    if(obj.id==id){
        flag = true;
    }else{
        if(obj.children)
        for(var i=0;i<obj.children.length;i++){
            flag = dps(obj.children[i],depth+1);
            if(flag)
                break;
        }
    }
    if(flag)
        return flag;
    ans[depth]=undefined;
}
arr.forEach(function(a){if(dps(a,0))return;})
return ans.filter(function(obj){return undefined!=obj;});
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏