
本文介绍如何将形如 name_1_2_3 John Doe 的字符串解析为路径数组 [1,2,3],并据此动态构建深度嵌套的 JavaScript 对象结构,支持重复路径追加、键值安全写入与层级自动创建。
本文介绍如何将形如 `name_1_2_3 john doe` 的字符串解析为路径数组 `[1,2,3]`,并据此动态构建深度嵌套的 javascript 对象结构,支持重复路径追加、键值安全写入与层级自动创建。
在实际数据处理中(如解析日志、表单映射或配置文件),我们常遇到以 _ 分隔的复合键名(如 name_1_2_3),需将其转换为多级嵌套对象结构:{ "1": { "2": { "3": { "name": "John Doe" } } } }。手动逐层赋值不仅冗余易错,且无法应对路径已存在、需复用中间层级的场景。正确做法是将路径抽象为可迭代的“导航栈”,通过指针式遍历动态创建缺失层级,并最终写入叶节点值。
以下是一个健壮、可复用的实现方案:
const rawData = [
'name_1_2_1 Joseph Jones',
'name_1_2_2 Mary Poppins',
'name_1_2_3 Sebastian Quincy',
'age_1_2_1 20',
'age_1_2_2 40',
'age_1_2_3 60',
'will_plac_4_1_2 Atibaia, São Paulo, Brasil'
];
// 步骤 1:结构化原始数据 → 提取 route(路径)、key(字段名)、val(值)
const keyedData = rawData.map(line => {
const [routePart, ...valueParts] = line.split(' ');
const keyBits = routePart.split('_');
const key = keyBits.shift(); // 如 'name', 'age', 'will_plac'
const route = keyBits; // 如 ['1','2','1']
return {
route,
key,
val: valueParts.join(' ') // 支持值中含空格(如人名、地址)
};
});
// 步骤 2:构建嵌套对象(核心逻辑)
function buildNestedObject(data) {
const root = {};
data.forEach(item => {
let current = root; // 每次从根开始导航
// 遍历路径片段,逐层确保目标对象存在
for (let i = 0; i < item.route.length; i++) {
const segment = item.route[i];
if (!current[segment]) {
current[segment] = {}; // 创建新层级
}
current = current[segment]; // 下移指针
}
// 在最终层级写入 key-value 对
current[item.key] = item.val;
});
return root;
}
// 执行并输出结果
const result = buildNestedObject(keyedData);
console.log(JSON.stringify(result, null, 2));输出示例:
{
"1": {
"2": {
"1": {
"name": "Joseph Jones",
"age": "20"
},
"2": {
"name": "Mary Poppins",
"age": "40"
},
"3": {
"name": "Sebastian Quincy",
"age": "60"
}
}
},
"4": {
"1": {
"2": {
"will_plac": "Atibaia, São Paulo, Brasil"
}
}
}
}✅ 关键优势说明:
立即学习“Java免费学习笔记(深入)”;
-
自动补全层级:无需预判
e[record]是否存在,current[segment] = {}确保路径畅通; -
支持同路径多字段:
name_1_2_1和age_1_2_1共享路径["1","2","1"],最终合并到同一对象内; -
安全覆盖:若同一
key出现多次(如重复解析),后值将自然覆盖前值; -
语义清晰:
route表示导航路径,key是叶节点属性名,职责分离明确。
⚠️ 注意事项:
- 路径片段(如
"1")会被作为字符串键使用;若需数字键,可改为Number(segment),但需确保无前导零或非数字字符; - 若原始数据中存在非法格式(如
name__1_2导致空字符串路径段),建议在keyBits.shift()前添加.filter(Boolean)过滤空项; - 大规模数据下,可考虑使用
Map替代普通对象提升性能(尤其当路径段为复杂字符串时)。
此方法将“路径驱动的数据建模”转化为可预测、可调试、可扩展的标准流程,是处理动态嵌套结构的推荐实践。


















