遍历对象树和打印属性

时间:2016-07-19 23:55:39

标签: javascript

我试图遍历一个对象树,并使用递归打印出对象中的所有属性,包括嵌套属性。这是我的代码,但它被卡在循环中,我不确定我错过了什么。

var data = {
  person: {
    firstName: 'Mary'
  },
  color: 'blue'
};

function walk(root) {
  for(var i in root) {
    if(root.hasOwnProperty(i)) {
      console.log(i);
      if ( root[i] !== null && root[i] !== undefined && typeof(root[i] == 'object') ) {
        walk(root[i]);
      }    
    }
  }
}

walk(data);

1 个答案:

答案 0 :(得分:1)

注意: 此解决方案已更新为横向嵌套数组。

只是想关闭这个问题这就是为什么我花了一些时间来解决它,即使你现在可能正在玩他的调试工具(见评论)。

我遇到此问题的方法是使用instanceof API解决它。
查看:
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/instanceof

这样我就不需要额外的代码来做那些长篇大论的检查,比如

  1. root.hasOwnProperty(i)
  2. if ( root[i] !== null && root[i] !== undefined && typeof(root[i] == 'object') )
  3. 示例:

    var data = {
      person: {
        firstName: 'Mary',
        likes: {
          food: "apple",
          drinks: "water",
          d: null,
          x : {
            y: "z",
            ddd: [
              { bbb: "lol"},
              { PPP: "lol2"}
            ]
          },
          o: undefined
        }
      },
      color: 'blue'
    };
    
    function walk(root) {
      for (let property in root) {
        console.log(property);
        if (root[property] instanceof Array)
            root[property].forEach(item => { walk(item); });
        else if (root[property] instanceof Object)
          walk(root[property]);
        // Extend else if statement to handle customize structures appropriately.
      }
    }
    
    walk(data);
    

    <强>输出:

    person
    firstName
    likes
    food
    drinks
    d
    x
    y
    ddd
    e
    bbb
    PPP
    o
    color