使用Javascript将动态对象转换为基于键子字符串的多级JSON数组

使用Javascript将动态对象转换为基于键子字符串的多级JSON数组,javascript,json,Javascript,Json,我想从基于键子字符串的平面动态对象创建多级JSON数组 示例动态对象 { 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",

我想从基于键子字符串的平面动态对象创建多级JSON数组

示例动态对象

{
  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"
    },
  }
}]

使用
reduce
对输入对象的条目进行迭代,以检查条目并将其分类为所需的输出格式:

const输入={
本田自行车:“白色”,
脉冲星自行车:“黑色”,
皇家恩菲尔德自行车:“红色”,
现代汽车:“蓝色”,
奔驰车:“灰色”,
宝马汽车:“红色”
};
常量输出=[{}];
输出[0]。车辆=对象。条目(输入)。减少((a,[key,val])=>{
const vehicleName=key.match(/([^]+)$/)[0];
如果(!a[vehicleName])a[vehicleName]={};
a[车辆名称][钥匙]=val;
返回a;
}, {});

控制台日志(输出)以下是使用
对象进行此操作的简单方法。reduce
。首先使用
Object.keys
获取对象自己的可枚举键,然后使用
Object.reduce

设o={
本田自行车:“白色”,
脉冲星自行车:“黑色”,
皇家恩菲尔德自行车:“红色”,
现代汽车:“蓝色”,
奔驰车:“灰色”,
宝马汽车:“红色”
}
设keys=Object.keys(o);
让结果=关键点。减少((acc,cv)=>{
让[type]=cv.split(“”“).reverse();
acc[type]=acc[type]|{};
acc[type][cv]=o[cv];
返回acc;
}, {});
结果=[{
车辆:结果
}];

控制台日志(结果)
您可以循环查看
数据
对象的键,将
数据
对象的每个键相对于下划线进行分割,然后获取最后分割的值,为内部对象创建一个新键。在每次迭代中,检查是否创建了该新键,并根据该键将值分配给该内部对象

var数据={
本田自行车:“白色”,
脉冲星自行车:“黑色”,
皇家恩菲尔德自行车:“红色”,
现代汽车:“蓝色”,
奔驰车:“灰色”,
宝马汽车:“红色”
};
var vehicleObj={};
//循环遍历数据对象键
Object.key(数据).forEach((key)=>{
//拆分键并获取最后拆分的值
var splitArray=key.split(“”);
var newKey=splitArray[splitArray.length-1];
//基于拆分的值创建新对象
if(车辆对象[新钥匙]){
vehicleObj[newKey][key]=数据[key];
}否则{
vehicleObj[newKey]={};
vehicleObj[newKey][key]=数据[key];
}
});
//创建最终输出对象
var res=[{
“车辆”:车辆OBJ
}];
控制台日志(res)您可以使用检查所有对象,然后匹配vehicleType,这是您输入的每个键的最后一个字。如果匹配,则创建新对象并将相关类型的车辆推入该对象。下面是工作代码段:

让输入={
本田自行车:“白色”,
脉冲星自行车:“黑色”,
皇家恩菲尔德自行车:“红色”,
现代汽车:“蓝色”,
奔驰车:“灰色”,
宝马汽车:“红色”
};
让输出=[{}];
输出[0]。车辆=对象。条目(输入)。减少((a,[key,val])=>{
让vehicleType=(key.match(/([^ _]+)$/)[0]).toLowerCase();
如果(!a[vehicleType])a[vehicleType]={};
a[车辆类型][钥匙]=val;
返回a;
}, {});

控制台日志(输出)为什么要用dv发帖子?