如何将对象中numeric键替换为对应数字并保留原结构排序
解决JavaScript对象嵌套结构转换问题
需求说明
需要处理一个嵌套的JavaScript对象,完成三个核心操作:
- 仅保留对象中名为
numeric的属性,移除其他所有属性 - 根据给定的映射关系,将每个节点的
name替换为对应的数字键 - 严格保留原对象的层级结构与节点排序
相关数据示例
输入对象
const inputObj = { "name": "Query1", "numeric": [ { "name": "Basic Query Tasknode-2", "numeric": [], }, { "name": "Basic Query Tasknode-3", "numeric": [ { "name": "Basic Query Tasknode-4", "numeric": [ { "name": "Basic Query Tasknode-6", "numeric": [], } ], }, { "name": "Basic Query Tasknode-5", "numeric": [], } ], } ], };
预期输出
{ 1: { 2: '', 3: { 4: { 6: '', }, 5: '', }, }, };
名称-数字映射表
const numMap = { "1": { "trad": "Query1" }, "2": { "trad": "Basic Query Tasknode-2" }, "3": { "trad": "Basic Query Tasknode-3" }, "4": { "trad": "Basic Query Tasknode-4" }, "5": { "trad": "Basic Query Tasknode-6" }, "6": { "trad": "Basic Query Tasknode-5" } };
解决方案代码
因为是嵌套结构,用递归处理最直接。先做反向映射优化查询效率,再递归遍历转换:
// 先创建反向映射:名称 -> 对应的数字键 const reverseMap = Object.fromEntries( Object.entries(numMap).map(([num, { trad }]) => [trad, num]) ); // 递归转换函数 function transformNode(node) { const result = {}; // 获取当前节点对应的数字键 const key = reverseMap[node.name]; // 处理子节点 if (node.numeric.length === 0) { result[key] = ''; } else { result[key] = {}; node.numeric.forEach(childNode => { // 递归处理子节点,合并到当前结果中 Object.assign(result[key], transformNode(childNode)); }); } return result; } // 执行转换 const output = transformNode(inputObj); console.log(output);
代码说明
- 反向映射表:把原映射表的键值反转,这样可以通过节点的
name直接拿到对应的数字,不用每次遍历整个映射表,提升效率 - 递归函数:
- 每个节点先根据
name找到对应的数字键 - 如果当前节点的
numeric数组为空,就给这个数字键赋值'' - 如果有子节点,就递归处理每个子节点,把结果合并到当前节点的对象中
- 每个节点先根据
- 结构保留:通过
forEach遍历numeric数组,保证子节点的顺序和原输入一致
内容的提问来源于stack exchange,提问作者Will Krimmer
相关产品推荐
相关产品推荐

