如何将带分隔符的字符串递归拆分并构建嵌套对象?
动态嵌套对象赋值问题解决指引
需求说明
将类似 plan.details.notes 这种用分隔符连接的路径字符串解构,最终给路径的最末端节点赋值(比如"hello"),得到如下嵌套对象:
{ plan: { details: { notes: "hello" } } }
现有代码问题
你当前的代码只能处理两层节点,无法动态嵌套更深的结构:
function recursiveSplitIntoObject(string, delimiter, value) { if (!string) return {} let stringToSplit = string const returnObj = {} while (stringToSplit.indexOf(delimiter) >= 0) { const split = string.split(delimiter) returnObj[split[0]] = { [split[1]]: value } stringToSplit = split[1] } console.log(returnObj) }
解决方案
方案一:递归实现
通过递归逐层拆分路径,把剩余路径的处理结果作为当前节点的值:
function recursiveSplitIntoObject(string, delimiter, value) { if (!string) return {}; const parts = string.split(delimiter); // 只剩最后一个节点时,直接返回键值对 if (parts.length === 1) { return { [parts[0]]: value }; } // 递归处理剩余路径,将结果嵌套进当前节点 return { [parts[0]]: recursiveSplitIntoObject(parts.slice(1).join(delimiter), delimiter, value) }; } // 测试示例 const nestedObj = recursiveSplitIntoObject('plan.details.notes', '.', 'hello'); console.log(nestedObj);
方案二:迭代实现(从后往前构建)
先拆分所有路径节点,从最末端开始逐层向前包裹对象:
function buildNestedObject(path, delimiter, value) { const parts = path.split(delimiter); // 从最后一个节点初始化对象 let currentObj = { [parts.pop()]: value }; // 倒序遍历剩余节点,逐层嵌套 for (let i = parts.length - 1; i >= 0; i--) { currentObj = { [parts[i]]: currentObj }; } return currentObj; } // 测试示例 const nestedObj = buildNestedObject('plan.details.notes', '.', 'hello'); console.log(nestedObj);
逻辑说明
两种方案核心都是逐层处理路径节点:
- 递归方案每次取第一个节点,把剩余路径交给递归函数处理,最终将递归返回的嵌套对象作为当前节点的值。
- 迭代方案从最后一个节点开始,不断用前面的节点包裹当前对象,最终生成完整的嵌套结构。
内容的提问来源于stack exchange,提问作者ericute
相关产品推荐
相关产品推荐

