如何遍历JavaScript对象并获取属性的父级属性?
获取JavaScript对象属性的父级及祖先属性
要获取属性的父级及祖先属性,核心是在递归遍历过程中传递并维护当前属性的父级链。下面是针对你的代码的修改实现:
修改后的遍历函数及示例
function iterate(o, parentChain = []) { Object.keys(o).forEach(function (k) { if (o[k] !== null && typeof o[k] === 'object') { // 递归遍历子对象时,将当前键加入父级链,传递给下一层 iterate(o[k], [...parentChain, k]); return; } if (typeof o[k] === 'boolean') { // 以'v9'为例,获取父级和祖父级属性 if (k === 'v9') { const parent = parentChain.at(-1); // ES2022+语法,等价于parentChain[parentChain.length - 1] const grandParent = parentChain.at(-2); console.log(`属性${k}的父级是${parent},祖父级是${grandParent}`); } } }); } const obj = { a: { 'v1': true, 'v2': true, 'v3': false }, b: { 'v4': false, 'v5': true, 'v6': false, c: { 'v7': false, 'v8': true, 'v9': false } } }; iterate(obj);
关键逻辑说明
- 新增
parentChain参数:这是一个数组,用来存储当前节点的所有祖先键,初始调用时默认是空数组。 - 递归传递父级链:每次遍历到子对象时,用扩展运算符创建新数组,把当前键加入后传递给下一层递归,避免修改原数组影响其他分支。
- 提取祖先属性:当找到目标布尔属性时,通过数组下标(或
at()方法)从parentChain中获取对应层级的祖先键。at(-1)取最后一个元素(父级),at(-2)取倒数第二个(祖父级)。
运行上述代码,控制台会输出:属性v9的父级是c,祖父级是b,完全满足需求。
注:如果需要支持更复杂的链式调用(比如类似
k.parent的写法),可以考虑给属性键包装父级引用,但这种方式会额外占用内存且可能污染原对象,不如直接使用父级链数组简洁可靠。
内容的提问来源于stack exchange,提问作者smolo
相关产品推荐
相关产品推荐

