我想从基于键子串的扁平动态对象创建多级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"
},
}
}]发布于 2018-05-10 14:06:19
使用reduce遍历输入对象的条目,以检查条目并将其分类为所需的输出格式:
const input = {
Honda_Bike: "white",
Pulsar_Bike: "black",
Royal_Enfield_Bike: "red",
Hyundai_Car: "blue",
Mercedes_Car: "grey",
BMW_Car: "red"
};
const output = [{ }];
output[0].vehicle = Object.entries(input).reduce((a, [key, val]) => {
const vehicleName = key.match(/([^_]+)$/)[0];
if (!a[vehicleName]) a[vehicleName] = {};
a[vehicleName][key] = val;
return a;
}, {});
console.log(output);
发布于 2018-05-10 14:12:51
以下是使用Object.reduce完成此操作的简单方法。首先使用Object.keys获取对象自己的可枚举键,然后使用Object.reduce。
let o = {
Honda_Bike: "white",
Pulsar_Bike: "black",
Royal_Enfield_Bike: "red",
Hyundai_Car: "blue",
Mercedes_Car: "grey",
BMW_Car: "red"
}
let keys = Object.keys(o);
let result = keys.reduce((acc, cv) => {
let [type] = cv.split('_').reverse();
acc[type] = acc[type] || {};
acc[type][cv] = o[cv];
return acc;
}, {});
result = [{
vehicle: result
}];
console.log(result);
发布于 2018-05-10 14:34:18
您可以遍历data对象的键,根据下划线_拆分data对象的每个键,然后获得最后拆分的值,为内部对象创建新的键。在每次迭代中,检查是否创建了这个新的键,并根据该键将值分配给这个内部对象。
var data = {
Honda_Bike: "white",
Pulsar_Bike: "black",
Royal_Enfield_Bike: "red",
Hyundai_Car: "blue",
Mercedes_Car: "grey",
BMW_Car: "red"
};
var vehicleObj = {};
//loop thorugh the data object keys
Object.keys(data).forEach((key)=>{
//split the key and get the last splited value
var splitArray = key.split('_');
var newKey = splitArray[splitArray.length - 1];
//create a new object based on the splited value
if(vehicleObj[newKey]){
vehicleObj[newKey][key] = data[key];
} else {
vehicleObj[newKey] = {};
vehicleObj[newKey][key] = data[key];
}
});
//create final output object
var res = [{
'vehicle': vehicleObj
}];
console.log(res);
https://stackoverflow.com/questions/50266392
复制相似问题