操作对象里的值

var arr = [
    {
        name:"新闻",
        id:1,
        parent_id: 0,
        child:[
        {
          name:"广东新闻",
          id:2,
          parent_id: 1,
            child:[
              {
                now: true,
                  name:"深圳新闻",
                  id:4,
                  parent_id: 2
              },{
                now: false,
                  name:"广州新闻",
                  id:5,
                  parent_id: 2
              }
          ]
        },
        {
          name:"湖南新闻",
          id:3,
          parent_id: 1,
          child:[
            {
              now: true,
              name:"株洲新闻",
              parent_id: 3,
              id:6
            },{
              now: false,
              name:"长沙新闻",
              parent_id: 3,
              id:7
            }
          ]
        }]
      },
      {
        name:"学院",
        id:8,
        parent_id: 0,
        child:[
        {
          name:"广东学院",
          id:9,
          parent_id: 8,
            child:[
              {
                now: true,
                  name: "深圳大学",
                  id:11,
                  parent_id: 9
              },{
                now: false,
                  name:"中山大学",
                  id:12,
                  parent_id: 9
              }
          ]
        },
        {
          name:"湖南学院",
          id:10,
          parent_id: 8,
          child:[
            {
              now: false,
              name:"长沙师范学院",
              parent_id: 10,
              id:13
            },{
              now: false,
              name:"株洲学院",
              parent_id: 10,
              id:14
            }
          ]
        }]
      },
    ];

我想获取数组的最后级一级如果now为true的话根据他的parent_id找到他的父级,
然后获取它以及它父级的id,这样不断向上获取它的父级
最后返回一个数组结果是[1,2,3,4,6,8,9,11]
这样该怎么查找?

阅读 1.5k
2 个回答

你的意思是会有多个诸如[1,2...11]类似这样导航到最终now=true的数组?
如果是这样,其实你应该从顶部开始查询,查询到一级有分支就深拷贝一个数组对应不同分支,直到底层,然后排除掉不符合要求的。这样可能效率更高一些。当然,这样做的前提是提供的数据是符合结构的。

正确的只有3个路径,是[[1,2,4],[1,3,6],[8,9,11]]

//实现的代码
function objP(bArr, inArr){
    var rt=[];
    for(var i=0;i<inArr.length;i++){
        if(inArr[i].now===false){
            continue;
        } else if(inArr[i].now){
            var newBArr=bArr.concat(inArr[i].id);
            rt.push(newBArr);
            continue;
        } else if(inArr[i].child){
            var tmp=objP([inArr[i].id], inArr[i].child)
            for(var j=0;j<tmp.length;j++){
                rt.push(bArr.concat(tmp[j]));
            }
        } 
    }
    return rt;
}   

console.log(objP([],arr));  

你的思路很明确,学一下js的基础语法和数组操作就知道怎么做了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题