简体   繁体   English

使用Javascript将动态对象转换为基于Key Substring的多级JSON数组

[英]Convert dynamic object to multi level JSON array based on Key Substring using Javascript

I want to create multi level JSON array from flat dynamic object based on Key Substring 我想基于Key Substring从平面动态对象创建多级JSON数组

Sample dynamic object 示例动态对象

{
  Honda_Bike: "white",
  Pulsar_Bike: "black",
  Royal_Enfield_Bike: "red",
  Hyundai_Car: "blue",
  Mercedes_Car: "grey",
  BMW_Car: "red"
}

Sample Json Multi - Level array 示例Json Multi-Level数组

[{
  vehicle : {
    bike: {
      Honda_Bike: "white",
      Pulsar_Bike: "black",
      Royal_Enfield_Bike: "red"
    },
    car: {
      Hyundai_Car: "blue",
      Mercedes_Car: "grey",
      BMW_Car: "red"
    },
  }
}]

Use reduce to iterate over the entries of the input object to check and categorize the items into your desired output format: 使用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); 

Here is a simple way of doing this using Object.reduce . 这是使用Object.reduce执行此操作的简单方法。 First get the Object's own enumerable keys using Object.keys then use Object.reduce . 首先使用Object.keys获取Object自己的可枚举键,然后使用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); 

You can loop through the keys of the data object, split each key of the data object with respect to underscore _ and then get the last splitted value to create a new key for the inner object. 你可以通过的钥匙环data对象,分裂的每个键data对象相对于下划线_ ,然后得到最后的分裂值创建内部对象一个新的密钥。 In each iteration check if this new key is created or not and based on that assign the value to this inner object. 在每次迭代中检查是否创建了这个新密钥,并根据该密钥将值赋给此内部对象。

 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); 

You can use reduce to check all the objects and then match vehicleType which is last word of each key you. 您可以使用reduce来检查所有对象,然后匹配vehicleType,它是每个键的最后一个单词。 If matches then create new object and push related type vehicles into that. 如果匹配则创建新对象并将相关类型的车辆推入其中。 Below is working code snippet: 以下是工作代码片段:

 let input = { Honda_Bike: "white", Pulsar_Bike: "black", Royal_Enfield_Bike: "red", Hyundai_Car: "blue", Mercedes_Car: "grey", BMW_Car: "red" }; let output = [{}]; output[0].vehicle = Object.entries(input).reduce((a, [key, val]) => { let vehicleType = (key.match(/([^_]+)$/)[0]).toLowerCase(); if (!a[vehicleType]) a[vehicleType] = {}; a[vehicleType][key] = val; return a; }, {}); console.log(output); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM