You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态创建嵌套JavaScript对象:点分隔字符串转嵌套JSON问题

我来帮你搞定这个把点分隔字符串转嵌套JSON的问题!这种需求其实挺常见的,不管是处理配置项路径还是构建嵌套数据结构都用得上。

解决方案:把点分隔字符串转为嵌套JSON对象

思路解析

核心逻辑很简单:

  • 先把点分隔的字符串拆分成键名数组(比如 "a.b.c" 拆成 ["a", "b", "c"])
  • 然后通过迭代或函数式方法逐层构建嵌套对象,要么从外层往内层递推,要么从内层往外层包裹

方法1:逐层递推(直观易懂)

这种写法逻辑清晰,适合新手理解,能处理任意长度的点分隔字符串:

function dotStringToNestedObj(dotStr, finalValue = {}) {
  // 拆分字符串为键数组
  const keys = dotStr.split('.');
  // 初始化最外层对象
  const result = {};
  // 用current跟踪当前嵌套层级
  let current = result;

  // 遍历除最后一个键之外的所有键,创建中间嵌套对象
  for (let i = 0; i < keys.length - 1; i++) {
    current[keys[i]] = {};
    current = current[keys[i]];
  }

  // 给最后一个键赋值(默认是空对象,也可以传自定义值)
  current[keys[keys.length - 1]] = finalValue;

  return result;
}

测试示例

// 测试短路径
console.log(dotStringToNestedObj('user.name'));
// 输出:{ user: { name: {} } }

// 测试长路径
console.log(dotStringToNestedObj('a.b.c.d.e'));
// 输出:{ a: { b: { c: { d: { e: {} } } } } }

// 给最后一个键传自定义值
console.log(dotStringToNestedObj('settings.theme.bgColor', '#f5f5f5'));
// 输出:{ settings: { theme: { bgColor: '#f5f5f5' } } }

方法2:函数式写法(简洁优雅)

如果喜欢更简洁的代码,可以用reduceRight从内往外包裹对象,一行核心逻辑搞定:

function dotStringToNestedObj(dotStr, finalValue = {}) {
  const keys = dotStr.split('.');
  // 从最后一个键开始,逐层向外包裹成对象
  return keys.reduceRight((acc, key) => ({ [key]: acc }), finalValue);
}

测试示例

console.log(dotStringToNestedObj('x.y.z'));
// 输出:{ x: { y: { z: {} } } }

console.log(dotStringToNestedObj('config.api.baseUrl', 'https://example.com'));
// 输出:{ config: { api: { baseUrl: 'https://example.com' } } }

额外优化:处理异常格式

如果你的字符串可能存在首尾多余的点、连续点等异常格式,可以先做清洗:

function cleanDotString(dotStr) {
  // 去除首尾的点,合并连续的点
  return dotStr.replace(/^\.*|\.*$/g, '').replace(/\.+/g, '.');
}

// 处理异常示例
console.log(cleanDotString('..a..b.c..')); // 输出:"a.b.c"

内容的提问来源于stack exchange,提问作者Kaushal28

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:07:32