
本文介绍如何通过 reduceright 方法将一维对象数组高效转换为深度嵌套的树形结构,使每个元素成为前一个元素的 child 子项,最终形成单链式嵌套对象。
本文介绍如何通过 reduceright 方法将一维对象数组高效转换为深度嵌套的树形结构,使每个元素成为前一个元素的 child 子项,最终形成单链式嵌套对象。
在实际开发中,我们常需将线性数据(如菜单项、步骤列表或层级路径)动态构造成具有父子关系的嵌套结构。给定如下扁平数组:
const array = [
{ number: 1, name: 'one', child: [] },
{ number: 2, name: 'two', child: [] },
{ number: 3, name: 'three', child: [] }
];目标是将其转化为单向深度嵌套形式:
const nested = [
{
number: 1,
name: 'one',
child: [
{
number: 2,
name: 'two',
child: [
{
number: 3,
name: 'three',
child: []
}
]
}
]
}
];关键在于逆序累积:从最后一个元素开始,逐层将其包裹为上一个元素的 child 数组中的唯一子项。此时 Array.prototype.reduceRight() 是最简洁、函数式且无副作用的选择。
✅ 推荐实现(一行核心逻辑):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
const nested = [array.reduceRight((acc, curr) => ({
...curr,
child: [acc]
}), { child: [] })];⚠️ 注意事项:
- reduceRight 从右向左遍历,确保 array[2] 先作为 array[1].child 的内容,再整体作为 array[0].child 的内容;
- 初始值 { child: [] } 是占位哨兵,避免对空数组调用时出错;最终结果用 [...] 包裹成数组,匹配预期输出格式;
- 原始数组中每个对象的 child 字段会被覆盖——若需保留原始 child 内容(如预设子项),应改用 child: [...curr.child, acc] 合并;
- 此方案适用于「严格线性嵌套」场景;如需多叉树、ID 引用映射或循环依赖处理,请改用基于 parentId 的递归构建算法。
? 小结:该方法以极简代码达成清晰语义——“把右边所有内容,作为当前项的子节点”。它体现了函数式编程中累积(reduction)与不可变更新(spread syntax)的优雅结合,是构建简单嵌套结构的首选实践。

















