使用JavaScript根据键子串将动态对象转换为多级JSON数组
解决方案:从扁平对象按键子串生成多级JSON结构
嘿,我来帮你搞定这个需求——把带后缀的扁平对象转换成多级嵌套的JSON结构对吧?先理清楚你的输入和期望输出,再给你具体的实现方案。
你的输入示例
const flatVehicleObj = { Honda_Bike: "white", Pulsar_Bike: "black", Royal_Enfield_Bike: "red", Hyundai_Car: "blue", Mercedes_Car: "grey", BMW_Car: "red" };
期望的多级JSON输出
[{ vehicle : { bike: { Honda_Bike: "white", Pulsar_Bike: "black", Royal_Enfield_Bike: "red" }, car: { Hyundai_Car: "blue", Mercedes_Car: "grey", BMW_Car: "red" } } }]
实现思路
核心就是按键的后缀分组,步骤很清晰:
- 遍历扁平对象的每一组键值对
- 拆分键名,提取出后缀(比如
_Bike里的Bike) - 把同一后缀的键值对归类到对应的嵌套层级中
- 最后包装成你需要的数组格式
代码实现(JavaScript)
我写了两种版本,一种是针对你给定的固定后缀(bike/car),另一种是能自动适配新后缀的通用版:
固定后缀版(匹配你的示例需求)
function transformToNestedObj(flatObj) { // 初始化嵌套结构的核心容器 const vehicleContainer = { bike: {}, car: {} }; // 遍历扁平对象的所有键值对 for (const [key, value] of Object.entries(flatObj)) { // 拆分键名,拿到后缀部分(比如从"Honda_Bike"得到"Bike") const suffix = key.split('_').pop(); // 转成小写,匹配嵌套结构里的键名 const nestedKey = suffix.toLowerCase(); // 将当前键值对添加到对应的嵌套对象中 if (vehicleContainer[nestedKey]) { vehicleContainer[nestedKey][key] = value; } } // 包装成最终的数组格式 return [{ vehicle: vehicleContainer }]; } // 测试一下 const flatObj = { Honda_Bike: "white", Pulsar_Bike: "black", Royal_Enfield_Bike: "red", Hyundai_Car: "blue", Mercedes_Car: "grey", BMW_Car: "red" }; const result = transformToNestedObj(flatObj); console.log(JSON.stringify(result, null, 2));
通用适配版(自动处理新后缀)
如果之后要新增_Truck、_Bus这类后缀,用这个版本更灵活:
function transformToNestedObj(flatObj) { const vehicleContainer = {}; for (const [key, value] of Object.entries(flatObj)) { const suffix = key.split('_').pop(); const nestedKey = suffix.toLowerCase(); // 如果当前后缀对应的嵌套对象不存在,先创建空对象 if (!vehicleContainer[nestedKey]) { vehicleContainer[nestedKey] = {}; } vehicleContainer[nestedKey][key] = value; } return [{ vehicle: vehicleContainer }]; }
比如新增Ford_Truck: "yellow",这个版本会自动生成truck层级,不用改代码~
内容的提问来源于stack exchange,提问作者Rashmi Chinnappa
相关产品推荐
相关产品推荐

