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

如何将点分割的层级key数组转换为嵌套对象并为末端键赋值空字符串

键名数组转嵌套空字符串对象解决方案

任务

将键名数组转换为单个对象,每个最终键赋值为空字符串("")。

问题说明

键名字符串用点(.)分隔,对应最终对象的不同嵌套层级,比如defaultToolConf.graph.graphApiConf.url对应对象4层嵌套结构。

输入数组示例

[
  'ADMIN_URL_REGEXP', 
  'BASE_PATH', 
  'appName', 
  'defaultToolConf',
  'defaultToolConf.graph', 
  'defaultToolConf.graph.graphApiConf', 
  'defaultToolConf.graph.graphApiConf.markerCampaignsUrl',
  'defaultToolConf.graph.graphApiConf.markerUrl', 
  'defaultToolConf.graph.graphApiConf.ndviUrl',
  'defaultToolConf.graph.graphLineColors', 
  'defaultToolConf.query', 
  'defaultToolConf.query.canExportKml', 
  'defaultToolConf.query.isExportEnabled', 
  'defaultToolConf.query.isResizable', 
  'defaultToolConf.test', 
  'defaultToolConf.toolsPermissionsPath', 
  'token', 
  'token.format', 
  'token.key', 
  'token.paths'
]

期望输出对象示例

{
  "ADMIN_URL_REGEXP": "",
  "BASE_PATH": "",
  "appName": "",
  "defaultToolConf": {
    "graph": {
      "graphApiConf": {
        "markerCampaignsUrl": "",
        "markerUrl": "",
        "ndviUrl": ""
      },
      "graphLineColors": ""
    },
    "query": {
      "canExportKml": "",
      "isExportEnabled": "",
      "isResizable": ""
    },
    "test": "",
    "toolsPermissionsPath": ""
  },
  "token": {
    "format": "",
    "key": "",
    "paths": ""
  }
}

已存在的问题

  • 已实现的多深度嵌套对象生成逻辑,默认给所有键赋值为空对象{},无法将末端键替换为空字符串
  • 生成的对象中存在重复键

解决方案

实现思路

  1. 先将所有输入键存入Set,方便快速校验某个键是否存在下级子键
  2. 遍历每个键拆分层级逐段处理:
    • 每拼接完一级完整路径,判断是否有其他键以当前路径.开头,无则为末端键,直接赋值为""
    • 非末端键若未初始化则创建为对象,已存在的直接复用,避免生成重复键
  3. 生成过程中直接赋值正确类型,无需后续二次遍历替换,性能更高

代码实现

function buildNestedObject(keys) {
  const result = {};
  const keySet = new Set(keys);

  keys.forEach(keyStr => {
    const keyParts = keyStr.split('.');
    let current = result;
    for (let i = 0; i < keyParts.length; i++) {
      const part = keyParts[i];
      const fullCurrentPath = keyParts.slice(0, i + 1).join('.');
      // 判断当前路径是否为末端节点(没有子级路径)
      const isEndNode = !Array.from(keySet).some(k => k.startsWith(`${fullCurrentPath}.`));
      if (isEndNode) {
        current[part] = "";
        break;
      }
      // 非末端节点初始化对象,已存在则直接复用
      if (!current[part]) {
        current[part] = {};
      }
      current = current[part];
    }
  });
  return result;
}

// 调用测试
const inputKeys = [
  'ADMIN_URL_REGEXP', 
  'BASE_PATH', 
  'appName', 
  'defaultToolConf',
  'defaultToolConf.graph', 
  'defaultToolConf.graph.graphApiConf', 
  'defaultToolConf.graph.graphApiConf.markerCampaignsUrl',
  'defaultToolConf.graph.graphApiConf.markerUrl', 
  'defaultToolConf.graph.graphApiConf.ndviUrl',
  'defaultToolConf.graph.graphLineColors', 
  'defaultToolConf.query', 
  'defaultToolConf.query.canExportKml', 
  'defaultToolConf.query.isExportEnabled', 
  'defaultToolConf.query.isResizable', 
  'defaultToolConf.test', 
  'defaultToolConf.toolsPermissionsPath', 
  'token', 
  'token.format', 
  'token.key', 
  'token.paths'
];
console.log(JSON.stringify(buildNestedObject(inputKeys), null, 2));

注:原期望输出中的tokenInterceptor为笔误,代码实际输出和输入键匹配的token嵌套对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:36:02