使用map和reduce(如果可能)javascript对动态JSON键进行分组

使用map和reduce(如果可能)javascript对动态JSON键进行分组,javascript,json,ecmascript-6,Javascript,Json,Ecmascript 6,我想对json的动态对象键进行分组。每个关键点的对象值将分组到各自的关键点 我尝试使用map和reduce对其进行分组,但结果并没有按预期进行分组 这是我的JSON对象 var data = [ { "type": 6, "data": { "error": { "cause": { "root": { "Extracted": { "Body": {

我想对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"
          }
       }
    ]
 }
]

您可以
减少
数组。使用唯一的
ErrorString
键创建累加器对象。将值设置为与键具有相同
ErrorString
的对象。然后根据
ErrorString
添加每个
info
对象。使用“获取分组值作为数组”

const data=[{type:6,data:{error:{原因:{root:{Extracted:{Body:{error:{143],ErrorString:“NotFound”,info:{error:{error:{error:{未找到数据,{attrib:{subsu name:“123com”,subsu no:4}}}}}}}}}}}}},状态:true},{type:6,数据:{错误:{原因:{提取:{Body:{error:{错误:{Body:{error:{错误:{founded:{Found Found Found Found Found Found Found Found“未找到公司”,subs:{attrib:{subs_name:“QRS”,subs_no:4}}}}},状态:true},{type:6,数据:{error:{restracted:{Body:{error:{error:“123”,ErrorString:“SystemFailure”,信息:{errorDesc Internal server error:{error:“内部服务器错误”,subs:{attrib:{subs:{subs:{subs:{subs_name:“ABC”,subs:{attrib:{no:2},状态:Extracted Body:{error:},数据类型:true:},错误:{{Error:{ErrorCode:“123”,ErrorString:“SystemFailure”,info:{Error:{errorDesc:{errorDesc:“数据不足”,subs:{attrib:{subs:”DEF”,subs:{subs:”no:3}}}}}}},status:true},{type:6,Data:{Error:{原因:{根:{提取:{Body:{Error:{Error:{ErrorCode:“999”,ErrorString:“未知”,info:{未知:{desc Unknown:{状态:},subs:{GHI:},状态:}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]。推送(e.info)
返回acc;
}, {})
常量输出=对象值(合并);

console.log(output)
谢谢@adiga!你能给我解释一下每行代码是如何工作的吗?通过对代码的评论?我对如何在json中使用reduce并不太熟悉。