如何从包含嵌套对象的javascript对象文本中获取所有属性名?

如何从包含嵌套对象的javascript对象文本中获取所有属性名?,javascript,object-literal,Javascript,Object Literal,例如,如果我有以下javascript对象文字: var foo = { a: '1', b: { doit: function toit(){}, c: true, d: { x: true, y: true } } } 如何获取所有属性名称的数组?例如: ['a', 'b', 'doit', 'c', 'd', 'x', 'y'] 您可以使用这个递归函数 fun

例如,如果我有以下javascript对象文字:

var foo = {
    a: '1',
    b: {
        doit: function toit(){},
        c: true,
        d: {
          x: true,
          y: true
        }
    }
}
如何获取所有属性名称的数组?例如:

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

您可以使用这个递归函数

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' ]

可以使用for in循环遍历所有属性,并将它们推送到数组中

> 
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);
      }
   }
}
试试这个:(递归函数)


此处演示:

这样的函数可以完成以下任务:

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;
}

For in循环将非常适合于此。这里有一个关于它们的链接
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;
}