首页 > 解决方案 > 如果可能,使用 map 和 reduce 对动态 JSON 键进行分组 javascript

问题描述

我想对 json 的动态对象键进行分组。每个键的对象值将分组到它们各自的键。

我尝试使用 map 和 reduce 对其进行分组,但结果未按预期分组。

这是我的 JSON 对象

var data = [
  {
    "type": 6,
    "data": {
      "error": {
        "cause": {
          "root": {
            "Extracted": {
              "Body": {
                "Error": {
                  "ErrorCode": "143",
                  "ErrorString": "NotFound",
                  "info": {
                    "Error": {
                      "errorDesc": "Data Not Found",
                      "subs": {
                        "attrib": {
                          "subs_name": "123com",
                          "subs_no": 4
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "status": true
  },
  {
    "type": 6,
    "data": {
      "error": {
        "cause": {
          "root": {
            "Extracted": {
              "Body": {
                "Error": {
                  "ErrorCode": "143",
                  "ErrorString": "NotFound",
                  "info": {
                    "Error": {
                      "errorDesc": "Company Not Found",
                      "subs": {
                        "attrib": {
                          "subs_name": "QRS",
                          "subs_no": 4
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "status": true
  },
  {
    "type": 6,
    "data": {
      "error": {
        "cause": {
          "root": {
            "Extracted": {
              "Body": {
                "Error": {
                  "ErrorCode": "123",
                  "ErrorString": "SystemFailure",
                  "info": {
                    "Error": {
                      "errorDesc": "Internal server error",
                      "subs": {
                        "attrib": {
                          "subs_name": "ABC",
                          "subs_no": 2
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "status": true
  },
  {
    "type": 6,
    "data": {
      "error": {
        "cause": {
          "root": {
            "Extracted": {
              "Body": {
                "Error": {
                  "ErrorCode": "123",
                  "ErrorString": "SystemFailure",
                  "info": {
                    "Error": {
                      "errorDesc": "Insufficient Data",
                      "subs": {
                        "attrib": {
                          "subs_name": "DEF",
                          "subs_no": 3
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "status": true
  },
  {
    "type": 6,
    "data": {
      "error": {
        "cause": {
          "root": {
            "Extracted": {
              "Body": {
                "Error": {
                  "ErrorCode": "999",
                  "ErrorString": "Unknown",
                  "info": {
                    "Unknown": {
                      "desc": "UnknownError",
                      "subs": "GHI"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "status": true
  }
]

这是我尝试过但没有得到我想要的结果的代码

var x = data.map((e) => {
  var el = {}
    el[e.data.error.cause.root.Extracted.Body.Error.ErrorString] = 
    [e.data.error.cause.root.Extracted.Body.Error.info];

    return el;
  })

 console.log(x);

我得到的结果:

 [
   {
     "NotFound": {....}
   },
   {
     "NotFound": {....}
   },
   {
     "SystemFailure": {....}
   },
   {
     "SystemFailure": {....}
   },
   {
     "Unknown": {....}
   },
 ]

我期望的结果:

[
 {
   "NotFound": [
     {
       "Error": {
         "errorDesc": "Data Not Found",
         "subs": {
           "attrib": {
              "subs_name": "123com",
              "subs_no": 4
         }
       }
     },
     {
       "Error": {
         "errorDesc": "Company Not Found",
         "subs": {
         "attrib": {
            "subs_name": "QRS",
            "subs_no": 4
         }
       }
     }
   }
  ]
 },
 { 
   "SystemFailure": [
      {
       "Error": {
          "errorDesc": "Internal server error",
          "subs": {
              "attrib": {
              "subs_name": "ABC",
              "subs_no": 2
            }
          }
      },
      {
        "Error": {
            "errorDesc": "Insufficient Data",
            "subs": {
               "attrib": {
                  "subs_name": "DEF",
                  "subs_no": 3
               }
            }
      }
   ]
 },
 {
    "Unknown": [
       {
          "Unknown": {
            "desc": "UnknownError",
            "subs": "GHI"
          }
       }
    ]
 }
]

标签: javascriptjsonecmascript-6

解决方案


你可以reduce阵列。ErrorString创建一个具有唯一键的累加器对象。将 value 设置为与ErrorStringkey 相同的对象。然后根据 . 添加每个info对象ErrorString。使用Object.values()将分组值作为数组获取

const data=[{type:6,data:{error:{cause:{root:{Extracted:{Body:{Error:{ErrorCode:"143",ErrorString:"NotFound",info:{Error:{errorDesc:"Data Not Found",subs:{attrib:{subs_name:"123com",subs_no:4}}}}}}}}}}},status:true},{type:6,data:{error:{cause:{root:{Extracted:{Body:{Error:{ErrorCode:"143",ErrorString:"NotFound",info:{Error:{errorDesc:"Company Not Found",subs:{attrib:{subs_name:"QRS",subs_no:4}}}}}}}}}}},status:true},{type:6,data:{error:{cause:{root:{Extracted:{Body:{Error:{ErrorCode:"123",ErrorString:"SystemFailure",info:{Error:{errorDesc:"Internal server error",subs:{attrib:{subs_name:"ABC",subs_no:2}}}}}}}}}}},status:true},{type:6,data:{error:{cause:{root:{Extracted:{Body:{Error:{ErrorCode:"123",ErrorString:"SystemFailure",info:{Error:{errorDesc:"Insufficient Data",subs:{attrib:{subs_name:"DEF",subs_no:3}}}}}}}}}}},status:true},{type:6,data:{error:{cause:{root:{Extracted:{Body:{Error:{ErrorCode:"999",ErrorString:"Unknown",info:{Unknown:{desc:"UnknownError",subs:"GHI"}}}}}}}}},status:true}];

const merged = data.reduce((acc, o) => {
  const e = o.data.error.cause.root.Extracted.Body.Error;
  acc[e.ErrorString] = acc[e.ErrorString] || { [e.ErrorString]: [] };
  acc[e.ErrorString][e.ErrorString].push(e.info)
  return acc;
}, {})

const output = Object.values(merged);

console.log(output)


推荐阅读