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

如何将带分隔符的字符串递归拆分并构建嵌套对象?

动态嵌套对象赋值问题解决指引

需求说明

将类似 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:31:58