如何用JavaScript ES6优雅反转任意深度的JSON对象结构?
优雅的ES6实现方案
我理解你想要把嵌套的多语言JSON结构(语言标识在最内层)转换为以语言为顶级键的结构,这里给你一个简洁优雅的ES6实现,核心分为两步:收集所有语言键值对的完整路径,再反向构建目标对象。
实现代码
// 递归遍历原对象,收集每个语言值对应的路径和语言键 function collectPaths(obj, currentPath = []) { let paths = []; for (const [key, value] of Object.entries(obj)) { if (typeof value === 'object' && value !== null && !Array.isArray(value)) { // 递归处理嵌套对象,追加当前键到路径 paths.push(...collectPaths(value, [...currentPath, key])); } else { // 遇到具体值时,记录语言键、父路径和值 paths.push({ lang: key, parentPath: currentPath, value }); } } return paths; } // 根据收集的路径构建目标对象 function invertMultilingualObj(obj) { const result = {}; const paths = collectPaths(obj); for (const { lang, parentPath, value } of paths) { // 确保当前语言的顶级对象存在 if (!result[lang]) { result[lang] = {}; } let currentNode = result[lang]; // 遍历父路径的前n-1个键,逐层创建嵌套对象 for (let i = 0; i < parentPath.length - 1; i++) { const key = parentPath[i]; if (!currentNode[key]) { currentNode[key] = {}; } currentNode = currentNode[key]; } // 将值赋值到路径的最后一个节点 const finalKey = parentPath[parentPath.length - 1]; currentNode[finalKey] = value; } return result; }
测试示例
const a = { "cookie": { "CookieMessage": { "DE": "Nachricht", "EN": "Message" }, "CookieSorte": { "DE": "Keks", "EN": "Coook" } } }; console.log(invertMultilingualObj(a));
运行结果:
{ DE: { cookie: { CookieMessage: "Nachricht", CookieSorte: "Keks" } }, EN: { cookie: { CookieMessage: "Message", CookieSorte: "Coook" } } }
代码逻辑说明
collectPaths函数:- 递归遍历输入对象的每一层,遇到嵌套对象时继续深入,同时记录当前的路径数组
- 当遇到具体的字符串值时,将该值对应的语言标识、父级路径和值本身存入结果数组,为后续构建目标结构做准备
invertMultilingualObj函数:- 初始化空的结果对象,先调用
collectPaths拿到所有路径信息 - 遍历每条路径信息,为对应的语言标识创建顶级对象(如果不存在)
- 沿着父路径逐层创建嵌套对象,最终将值赋值到对应的层级位置
- 初始化空的结果对象,先调用
这个实现充分利用了ES6的Object.entries、扩展运算符等特性,代码简洁易读,同时支持任意深度的嵌套结构,完美匹配你想要的转换需求。
内容的提问来源于stack exchange,提问作者Marco B.
相关产品推荐
相关产品推荐

