2014-03-28 54 views
2

举例来说,如果我有这样的JavaScript对象字面:如何从包含嵌套对象的JavaScript对象字面值中获取所有属性名称?

var foo = { 
    a: '1', 
    b: { 
     doit: function toit(){}, 
     c: true, 
     d: { 
      x: true, 
      y: true 
     } 
    } 
} 

我怎样才能得到所有的属性名称的数组?如:

['a', 'b', 'doit', 'c', 'd', 'x', 'y'] 
+0

对于in循环将是完美的。这里是关于他们的链接http://javascriptweblog.wordpress.com/2011/01/04/exploring-javascript-for-in-loops/ – Zachooz

回答

0

您可以循环使用递归函数

function recursiveKeyFinder(object, result) { 
    for (var key in object) { 
     result.push(key); 
     if (Object(object[key]).toString() === "[object Object]") { 
      recursiveKeyFinder(object[key], result); 
     } 
    } 
    return result; 
} 

console.log(recursiveKeyFinder(foo, [])); 
# [ 'a', 'b', 'doit', 'c', 'd', 'x', 'y' ] 
0

您可以遍历所有属性使用了和他们推到一个数组。

> 
for (var key in foo) { 
    var obj = foo[key]; 
    for (var prop in obj) { 
     // important check that this is objects own property 
     // not from prototype prop inherited 
     if(obj.hasOwnProperty(prop)){ 
     arr.push(prop); 
     } 
    } 
} 
0

试试这个:(递归函数)

var foo = { 
    a: '1', 
    b: { 
     doit: function toit(){}, 
     c: true, 
     d: { 
      x: true, 
      y: true 
     } 
    } 
}; 

var getKeys = function (foo) { 
    var bar = []; 

    for (var key in foo) { 
     var _foo = foo [ key ]; 
     bar.push (key); 
     if (typeof _foo === 'object') { 
      var _bar = getKeys (foo [key]); 
      for (var _key in _bar) { 
       bar.push (_bar[_key]); 
      } 

     } 
    } 

    return bar; 
}; 


var bar = getKeys (foo); 

alert (bar); 

演示这里:JSFiddle

0

这样的功能,因为这将做的工作:

function getKeysRecursive(obj) 
{ 
    var keys = []; 

    (function r(obj) { 
    Object.keys(obj).forEach(function(key) { 
     keys.push(key); 
     if (obj[key] instanceof Object) { 
     r(obj[key]); 
     } 
    }); 
    }(obj)); 

    return keys; 
} 

Demo

相关问题