首页 > 求JavaScript对象的深度

求JavaScript对象的深度

var a = {
    aa: {
        aaa: 1,
        bbb: {
            aaaa: 9
        },
        ccc: {
            aaaa: {
                aaaaa: 9090,
                bbbbb: 90909
            }
        }
    }
}

假如有以上对象a,求a的深度。换做一个更加普通的,未知的对象,该如何解决?


//尽量用较少的代码来写,用了递归;
var depth = 1;
function getDepth(){return function(a){for(var i in a){var temp = typeof(a[i]);if (temp == 'object') {arguments.callee(a[i]);depth++;}}}}
getDepth()(a);
console.log(depth);


没想到好方法, 简单一点就是不断遍历对象的属性,如果属性值是对象的话在遍历这个对象,知道所有的都不是对象


function(object) {
    var level = 1;
    var key;
    for (key in object) {
        if (!object.hasOwnProperty(key)) continue;

        if (typeof object[key] == 'object') {
            var depth = utils.depthOf(object[key]) + 1;
            level = Math.max(depth, level);
        }
    }
    return level;
}

前提是你的object里面没有循环应用,否则这程序就死循环了。如果要防止这个,你就要记录下每个引用来比较了


var count = 0;
function deep(obj){
    for(key in obj){
        if(obj[key].constructor == Object){
            count++;
            deep(obj[key]);
        }
    }
}

deep(a);

console.log(count);

求a的深度?是不是想访问对象里面的值呢?如果是使用.符号,比如访问bbbbb的值:console.log(a.aa.ccc.aaaa.bbbbb);


var a = {
  aa: {
    aaa: 1,
    bbb: {
      aaaa: 9,
      dsfs: null,
      da: ['e9875t987']
    },
    ccc: {
      aaaa: {
        aaaaa: 9090,
        bbbbb: 90909
      }
    }
  }
}

function longTree (obj) {
  let walk = []
  ;(function walkTree (obj, deeppath) {
    if (Object.prototype.toString.call(obj) !== '[object Object]') {
      return walk.push(deeppath)
    }
    for (var i in obj) {
      walkTree(obj[i], deeppath + '.' + i)
    }
  })(obj, '')
  return Math.max.apply(null, walk.map(function (n) {
    return n.split('.').length
  }))
}

console.log(longTree(a))
// output
5

没有考虑数组里的object的深度

【热门文章】
【热门文章】