有没有一种好的方法可以遍历Javascript对象的所有子属性?

3

假设我有一个JavaScript对象,有没有一种方法可以迭代所有的基本子属性?

例如,如果我有一个对象

{
  foo: 17,
  bar: {
    a: 2,
    b: 7
  }
}

我希望能够遍历foo、bar.a和bar.b。请注意,我更喜欢使用Object.keys()来迭代,而不是使用for/in循环,尽管我相信我可以将任何for/in循环的响应转换为Object.keys()迭代。

2
你有尝试过任何方法吗? - phant0m
你要找的是“对象反射”。 - Joe
我可以编写一个递归检查所有对象属性并返回原始属性数组的函数,但我想知道是否有标准或内置的方法来实现它。 - ferson2020
@Joe 那是一个概念还是一个实际的功能?你能给我一个代码示例吗? - ferson2020
1
JavaScript 中没有内置支持递归枚举对象属性的功能。 - apsillers
2个回答

7
您可以使用递归函数来实现这个功能,例如:
var x = {
    foo: 17,
    bar: {
        a: 2,
        b: 7
    }
}

function parseObject(something) {
    var keys = Object.keys(something);
    for (var i = 0; i < keys.length; i++) {
        if (typeof something[keys[i]] === 'object') parseObject(something[keys[i]])
        else console.log(keys[i] + " : " + something[keys[i]]);
    }
}
parseObject(x);

生成以下输出:

foo : 17 
a : 2 
b : 7 

关于这个函数的说明。它递归遍历任何对象。例如,如果对象中有一个数组,您将为数组中的每个项目获得单独的行。

因此,对于以下对象:

var x = {
    foo: 17,
    bar: {
        a: 2,
        b: 7
    },
    foobar: [1,2,3]    
}

输出结果将会出现:
foo : 17 
a : 2 
b : 7 
0 : 1 
1 : 2 
2 : 3 

显然有处理这个问题的方法,但您需要根据自己的要求来修改该函数。

好的,谢谢。我可以看出这绝对适合我所需的。我想确认一下是否有内置函数或更标准的方法来完成这个任务,但如果没有的话,我会使用这个方法。 - ferson2020
something[keys[i]]null 时,它会失败,因为 typeof null === 'object' 是真的。然后抛出的错误是 "Uncaught TypeError: Cannot convert undefined or null to object"。我会在原始条件中添加 if(something[keys[i]]) 来确保它是真实的。 - Misael Abanto

0

4
在没有增加价值的情况下链接到其他的 Stack Overflow(SO)问题只是一条评论,而不是一个答案。 - John Koerner
1
这些问题是关于迭代属性的,我想要递归地迭代属性和子属性。 - ferson2020
我还想覆盖任意深度,所以我需要原始属性加上非原始属性的原始子属性,再加上非原始属性的非原始子属性的原始子属性,以此类推。 - ferson2020
你可以添加一个检查,并基于检查元素是否为对象使用 typeof element === 'object'; 进行递归调用。 - Mehdi Karamosly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接