如何根据键数组创建嵌套对象?解决层级节点关联的代码问题
如何通过数组生成嵌套层级对象?
你给出的需求很明确:给定数组 var level = ["a", "b", "x"];,要生成嵌套对象 { "a": { "b": { "x": { } } } },而你当前的代码问题在于每次都直接给根对象的属性赋值空对象,没有跟踪到上一级的节点。
我来给你说个简单的解决思路:维护一个指向当前层级节点的引用变量,每次循环时,先在当前节点下创建新的子对象,然后把这个引用变量更新为刚创建的子对象,这样就能一步步递进嵌套了。
修正后的基础循环代码
var level = ["a", "b", "x"]; var o = {}; var current = o; // 初始时current指向根对象 for (var c = 0, len = level.length; c < len; c += 1 ) { var part = level[c]; current[part] = {}; // 在当前节点下创建子对象 current = current[part]; // 更新current为新创建的子对象,作为下一次循环的当前节点 } console.log(o); // 输出 { "a": { "b": { "x": { } } } }
更简洁的写法:使用数组reduce方法
如果习惯函数式写法,用reduce可以简化逻辑,本质和上面的循环是一样的:
var level = ["a", "b", "x"]; var o = level.reduce((current, key) => { current[key] = {}; return current[key]; }, {}); console.log(o); // 同样得到目标嵌套对象
原理说明
不管是循环还是reduce,核心都是让一个变量始终指向当前正在操作的层级节点:
- 一开始这个变量指向根对象
o - 每处理一个数组元素,就在当前节点下创建对应key的空对象
- 然后把变量移动到这个新创建的子对象上,下一次循环就基于这个子对象继续创建下一层
这样就能完美实现层级嵌套的递进啦~
内容的提问来源于stack exchange,提问作者pumi




