如何将点分割的层级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": "" } }
已存在的问题
- 已实现的多深度嵌套对象生成逻辑,默认给所有键赋值为空对象
{},无法将末端键替换为空字符串 - 生成的对象中存在重复键
解决方案
实现思路
- 先将所有输入键存入Set,方便快速校验某个键是否存在下级子键
- 遍历每个键拆分层级逐段处理:
- 每拼接完一级完整路径,判断是否有其他键以
当前路径.开头,无则为末端键,直接赋值为"" - 非末端键若未初始化则创建为对象,已存在的直接复用,避免生成重复键
- 每拼接完一级完整路径,判断是否有其他键以
- 生成过程中直接赋值正确类型,无需后续二次遍历替换,性能更高
代码实现
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
相关产品推荐
相关产品推荐

