[英]How to convert nested object to array of object in javascript?
I have a JSON response from the server, "IN01", "IN02" and "2021", "2022" these are dynamic object keys.我有来自服务器的 JSON 响应,“IN01”、“IN02”和“2021”、“2022”这些是动态对象键。 I want to covert this structure to some other format.
我想将此结构转换为其他格式。 How to do with javascript?
怎么用javascript?
{
"holidayCalendar": [
{
"IN01": [
{
"2021": [
{
"month": "1",
"value": "0101111110111011011111101011110"
},
{
"month": "2",
"value": "1111110111111011111101111110"
},
{
"month": "3",
"value": "1111110111111011111101111110011"
}
]
},
{
"2022": [
{
"month": "4",
"value": "0011111101111110111111011011101"
},
{
"month": "5",
"value": "1111101111110111111011111101"
},
{
"month": "6",
"value": "1111101111110111111011111101111"
}
]
}
]
},
{
"IN02": [
{
"2021": [
{
"month": "1",
"value": "0101111110111011011111101011110"
},
{
"month": "2",
"value": "1111110111111011111101111110"
},
{
"month": "3",
"value": "1111110111111011111101111110011"
}
]
},
{
"2022": [
{
"month": "4",
"value": "0011111101111110111111011011101"
},
{
"month": "5",
"value": "1111101111110111111011111101"
}
]
}
]
}
]
}
Here key can be any value instead of "IN01", "IN02" etc also "2021" , "2021"
这里的键可以是任何值,而不是 "IN01", "IN02" 等,也可以是 "2021" , "2021"
I want to convert the above JSON data to below-mentioned format我想将上面的 JSON 数据转换成下面提到的格式
{
"holidayCalendar" : [
{
"location" : "IN01",
"year" : "2021",
"holidays" : [
{
"month": "1",
"value": "0101111110111011011111101011110"
},
{
"month": "2",
"value": "1111110111111011111101111110"
},
{
"month": "3",
"value": "1111110111111011111101111110011"
}
]
},
{
"location" : "IN01",
"year" : "2022",
"holidays" : [{
"month": "4",
"value": "0011111101111110111111011011101"
},
{
"month": "5",
"value": "1111101111110111111011111101"
},
{
"month": "6",
"value": "1111101111110111111011111101111"
}
]
},
{
"location" : "IN02",
"year" : "2021",
"holidays" : [
{
"month": "1",
"value": "0101111110111011011111101011110"
},
{
"month": "2",
"value": "1111110111111011111101111110"
},
{
"month": "3",
"value": "1111110111111011111101111110011"
}
]
},
{
"location" : "IN02",
"year" : "2022",
"holidays" : [
{
"month": "4",
"value": "0011111101111110111111011011101"
},
{
"month": "5",
"value": "1111101111110111111011111101"
}
]
}
]
}
Really appreciated your help.真的很感谢你的帮助。 Thank You !
谢谢你 !
You can easily achieve the result using flatMap
, Object.entries
您可以使用
flatMap
、 Object.entries
轻松实现结果
const obj = { holidayCalendar: [ { IN01: [ { "2021": [ { month: "1", value: "0101111110111011011111101011110", }, { month: "2", value: "1111110111111011111101111110", }, { month: "3", value: "1111110111111011111101111110011", }, ], }, { "2022": [ { month: "4", value: "0011111101111110111111011011101", }, { month: "5", value: "1111101111110111111011111101", }, { month: "6", value: "1111101111110111111011111101111", }, ], }, ], }, { IN02: [ { "2021": [ { month: "1", value: "0101111110111011011111101011110", }, { month: "2", value: "1111110111111011111101111110", }, { month: "3", value: "1111110111111011111101111110011", }, ], }, { "2022": [ { month: "4", value: "0011111101111110111111011011101", }, { month: "5", value: "1111101111110111111011111101", }, ], }, ], }, ], }; const result = { ...obj, holidayCalendar: obj.holidayCalendar.flatMap((obj) => Object.entries(obj).flatMap(([location, v]) => v.flatMap((o) => Object.entries(o).map(([year, holidays]) => ({ location, year, holidays, })) ) ) ), }; console.log(result);
/* This is not a part of answer. It is just to give the output full height. So IGNORE IT */ .as-console-wrapper { max-height: 100% !important; top: 0; }
If you want to use days
instead of value
then you can do as:如果您想使用
days
而不是value
那么您可以这样做:
const obj = { holidayCalendar: [ { IN01: [ { "2021": [ { month: "1", value: "0101111110111011011111101011110", }, { month: "2", value: "1111110111111011111101111110", }, { month: "3", value: "1111110111111011111101111110011", }, ], }, { "2022": [ { month: "4", value: "0011111101111110111111011011101", }, { month: "5", value: "1111101111110111111011111101", }, { month: "6", value: "1111101111110111111011111101111", }, ], }, ], }, { IN02: [ { "2021": [ { month: "1", value: "0101111110111011011111101011110", }, { month: "2", value: "1111110111111011111101111110", }, { month: "3", value: "1111110111111011111101111110011", }, ], }, { "2022": [ { month: "4", value: "0011111101111110111111011011101", }, { month: "5", value: "1111101111110111111011111101", }, ], }, ], }, ], }; const result = { ...obj, holidayCalendar: obj.holidayCalendar.flatMap((obj) => Object.entries(obj).flatMap(([location, v]) => v.flatMap((o) => Object.entries(o).map(([year, holidays]) => ({ location, year, holidays: holidays.map(({ value, ...rest }) => ({ ...rest, days: value, })), })) ) ) ), }; console.log(result);
/* This is not a part of answer. It is just to give the output full height. So IGNORE IT */ .as-console-wrapper { max-height: 100% !important; top: 0; }
Use Object.keys
to get all the keys of the object.使用
Object.keys
获取对象的所有键。 Usage example使用示例
var json = document.getElementById("json").value; var jsonObject = JSON.parse(json); jsonObject.holidayCalendar.forEach(function(x) { Object.keys(x).forEach(function(key) { console.log(key, x[key]); }); })
<textarea id="json"> { "holidayCalendar": [ { "IN01": [ { "2021": [ { "month": "1", "value": "0101111110111011011111101011110" }, { "month": "2", "value": "1111110111111011111101111110" }, { "month": "3", "value": "1111110111111011111101111110011" } ] }, { "2022": [ { "month": "4", "value": "0011111101111110111111011011101" }, { "month": "5", "value": "1111101111110111111011111101" }, { "month": "6", "value": "1111101111110111111011111101111" } ] } ] }, { "IN02": [ { "2021": [ { "month": "1", "value": "0101111110111011011111101011110" }, { "month": "2", "value": "1111110111111011111101111110" }, { "month": "3", "value": "1111110111111011111101111110011" } ] }, { "2022": [ { "month": "4", "value": "0011111101111110111111011011101" }, { "month": "5", "value": "1111101111110111111011111101" } ] } ] } ] } </textarea>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.