如何在JavaScript中将嵌套对象转换为对象数组并重置__parent属性?
如何将带__parent嵌套的对象转为父属性为null的对象数组?
这个需求其实挺常见的,我来给你分享一个简单靠谱的实现方式,用循环遍历的方法既直观,还能避免递归可能带来的栈溢出问题(尤其是对象层级很深的时候)。
实现思路
我们可以从传入的对象开始,逐层向上遍历每个__parent指向的父对象:
- 每次遍历都创建当前对象的副本,把副本里的
__parent属性直接设为null - 将处理好的副本加入结果数组
- 把当前遍历的对象切换为它的
__parent,直到没有父对象为止
代码实现
function flattenNestedParents(obj) { const result = []; let current = obj; while (current) { // 浅拷贝当前对象,并替换__parent为null const flattenedObj = { ...current, __parent: null }; result.push(flattenedObj); // 移动到父对象继续处理 current = current.__parent; } return result; }
测试示例
用你给出的示例对象测试一下:
const category = { id: 1, title: "a", level: 2, __parent: { id: 2, title: "b", level: 1, __parent: { id: 3, title: "c", level: 0 } } }; // 调用函数 const flattenedArray = flattenNestedParents(category); console.log(flattenedArray);
输出结果完全符合你的期望:
[{ id: 1, title: "a", level: 2, __parent: null }, { id: 2, title: "b", level: 1, __parent: null }, { id: 3, title: "c", level: 0, __parent:null }]
补充说明
- 如果你的对象里包含其他复杂嵌套结构(不是
__parent这种层级),需要深拷贝的话,可以把浅拷贝换成JSON.parse(JSON.stringify(current)),再修改__parent为null,但要注意这种方式无法处理函数、Symbol等不可序列化的内容。 - 循环的方式比递归更稳妥,即使对象层级非常深,也不会出现栈溢出的问题。
内容的提问来源于stack exchange,提问作者sanaz
相关产品推荐
相关产品推荐

