简体   繁体   English

如何在javascript中将嵌套对象转换为对象数组?

[英]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您可以使用flatMapObject.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.

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