动态创建嵌套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
相关产品推荐
相关产品推荐

