You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何根据键数组创建嵌套对象?解决层级节点关联的代码问题

如何通过数组生成嵌套层级对象?

你给出的需求很明确:给定数组 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

火山引擎 最新活动