【问题标题】:Best way to flatten JSON data [closed]扁平化 JSON 数据的最佳方法 [关闭]
【发布时间】:2020-08-26 15:31:35
【问题描述】:

我有如下 JSON 数据:

    "Positions": [
            {
              "CRVL_CMB_AMT": 0,
              "CRVL_PERUT_CMB_AMT": null,
              "ISS_ID": "USD",
              "LOCAL_CURR_CDE": "USD",
              "QUANTITY": -4739568084,
              "UT_PRC_CMB_AMT": 100,
              "VALVAL_CMB_AMT": -4739568084,
              "VALVAL_ALT_CMB_AMT": -4739568084,
              "Instrument": {
                "ISS_NME": "US DOLLAR",
                "ISS_TYP": "CASH",
                "ASSET_CLASS_MNEM": "BALANCE"
              }
            },
            {
              "CRVL_CMB_AMT": 0,
              "CRVL_PERUT_CMB_AMT": null,
              "ISS_ID": "REPO-USD-WF",
              "LOCAL_CURR_CDE": "USD",
              "QUANTITY": -770000,
              "UT_PRC_CMB_AMT": 100,
              "VALVAL_CMB_AMT": -770122,
              "VALVAL_ALT_CMB_AMT": -770122,
              "Instrument": {
                "ISS_NME": "REPURCHASE AGREEMENT -  USD WF",
                "ISS_TYP": "REPO",
                "ASSET_CLASS_MNEM": "CURR EQUIV"
              }
            },
            {
              "CRVL_CMB_AMT": 0,
              "CRVL_PERUT_CMB_AMT": null,
              "ISS_ID": "REPO-USD-GS",
              "LOCAL_CURR_CDE": "USD",
              "QUANTITY": -770000,
              "UT_PRC_CMB_AMT": 100,
              "VALVAL_CMB_AMT": -770122,
              "VALVAL_ALT_CMB_AMT": -770122,
              "Instrument": {
                "ISS_NME": "REPURCHASE AGREEMENT -  USD GS",
                "ISS_TYP": "REPO",
                "ASSET_CLASS_MNEM": "CURR EQUIV"
              }
            }
]

我想将此 JSON 转换为:

    [{
              "CRVL_CMB_AMT": 0,
              "CRVL_PERUT_CMB_AMT": null,
              "ISS_ID": "USD",
              "LOCAL_CURR_CDE": "USD",
              "QUANTITY": -4739568084,
              "UT_PRC_CMB_AMT": 100,
              "VALVAL_CMB_AMT": -4739568084,
              "VALVAL_ALT_CMB_AMT": -4739568084,          
              "ISS_NME": "US DOLLAR",
              "ISS_TYP": "CASH",
              "ASSET_CLASS_MNEM": "BALANCE"              
            },
{
                  "CRVL_CMB_AMT": 0,
                  "CRVL_PERUT_CMB_AMT": null,
                  "ISS_ID": "REPO-USD-WF",
                  "LOCAL_CURR_CDE": "USD",
                  "QUANTITY": -770000,
                  "UT_PRC_CMB_AMT": 100,
                  "VALVAL_CMB_AMT": -770122,
                  "VALVAL_ALT_CMB_AMT": -770122,
                    "ISS_NME": "REPURCHASE AGREEMENT -  USD WF",
                    "ISS_TYP": "REPO",
                    "ASSET_CLASS_MNEM": "CURR EQUIV"
                },
                {
                  "CRVL_CMB_AMT": 0,
                  "CRVL_PERUT_CMB_AMT": null,
                  "ISS_ID": "REPO-USD-GS",
                  "LOCAL_CURR_CDE": "USD",
                  "QUANTITY": -770000,
                  "UT_PRC_CMB_AMT": 100,
                  "VALVAL_CMB_AMT": -770122,
                  "VALVAL_ALT_CMB_AMT": -770122,
                    "ISS_NME": "REPURCHASE AGREEMENT -  USD GS",
                    "ISS_TYP": "REPO",
                    "ASSET_CLASS_MNEM": "CURR EQUIV"
                }]

有没有什么有效的方法来解决这个问题。数组的长度可以非常大,一万。

谢谢

【问题讨论】:

  • 不明白你的意思是扁平化。如果你想从 Position 创建数组,那么你可以[...obj.Positions]
  • 位置数组的每个元素都有键 Like Instruments,它本身就是对象由于我想在 Grid 中使用它,我需要从同级别的 Intruments 中获取键值。

标签: javascript json angular typescript


【解决方案1】:

如果是静态键,只需提取Instrument并传播到对象:

const data = {"Positions":[{"CRVL_CMB_AMT":0,"CRVL_PERUT_CMB_AMT":null,"ISS_ID":"USD","LOCAL_CURR_CDE":"USD","QUANTITY":-4739568084,"UT_PRC_CMB_AMT":100,"VALVAL_CMB_AMT":-4739568084,"VALVAL_ALT_CMB_AMT":-4739568084,"Instrument":{"ISS_NME":"US DOLLAR","ISS_TYP":"CASH","ASSET_CLASS_MNEM":"BALANCE"}},{"CRVL_CMB_AMT":0,"CRVL_PERUT_CMB_AMT":null,"ISS_ID":"REPO-USD-WF","LOCAL_CURR_CDE":"USD","QUANTITY":-770000,"UT_PRC_CMB_AMT":100,"VALVAL_CMB_AMT":-770122,"VALVAL_ALT_CMB_AMT":-770122,"Instrument":{"ISS_NME":"REPURCHASE AGREEMENT -  USD WF","ISS_TYP":"REPO","ASSET_CLASS_MNEM":"CURR EQUIV"}},{"CRVL_CMB_AMT":0,"CRVL_PERUT_CMB_AMT":null,"ISS_ID":"REPO-USD-GS","LOCAL_CURR_CDE":"USD","QUANTITY":-770000,"UT_PRC_CMB_AMT":100,"VALVAL_CMB_AMT":-770122,"VALVAL_ALT_CMB_AMT":-770122,"Instrument":{"ISS_NME":"REPURCHASE AGREEMENT -  USD GS","ISS_TYP":"REPO","ASSET_CLASS_MNEM":"CURR EQUIV"}}]};

const res = Object.values(data)[0].map(({ Instrument, ...o }) => ({ ...Instrument, ...o }));

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }

要动态执行此操作并检测哪些项目是对象,您需要遍历每个属性:

const data = {"Positions":[{"CRVL_CMB_AMT":0,"CRVL_PERUT_CMB_AMT":null,"ISS_ID":"USD","LOCAL_CURR_CDE":"USD","QUANTITY":-4739568084,"UT_PRC_CMB_AMT":100,"VALVAL_CMB_AMT":-4739568084,"VALVAL_ALT_CMB_AMT":-4739568084,"Instrument":{"ISS_NME":"US DOLLAR","ISS_TYP":"CASH","ASSET_CLASS_MNEM":"BALANCE"}},{"CRVL_CMB_AMT":0,"CRVL_PERUT_CMB_AMT":null,"ISS_ID":"REPO-USD-WF","LOCAL_CURR_CDE":"USD","QUANTITY":-770000,"UT_PRC_CMB_AMT":100,"VALVAL_CMB_AMT":-770122,"VALVAL_ALT_CMB_AMT":-770122,"Instrument":{"ISS_NME":"REPURCHASE AGREEMENT -  USD WF","ISS_TYP":"REPO","ASSET_CLASS_MNEM":"CURR EQUIV"}},{"CRVL_CMB_AMT":0,"CRVL_PERUT_CMB_AMT":null,"ISS_ID":"REPO-USD-GS","LOCAL_CURR_CDE":"USD","QUANTITY":-770000,"UT_PRC_CMB_AMT":100,"VALVAL_CMB_AMT":-770122,"VALVAL_ALT_CMB_AMT":-770122,"Instrument":{"ISS_NME":"REPURCHASE AGREEMENT -  USD GS","ISS_TYP":"REPO","ASSET_CLASS_MNEM":"CURR EQUIV"}}]};

const res = Object.values(data)[0].map(e => {
  Object.entries(e).forEach(([k, v]) => {
    if (v && typeof v == "object" && !v.map) {
      e = { ...e, ...v };
      delete e[k];
    }
  });
  return e;
});

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }

以上内容适用于单一深度的任何嵌套对象。

【讨论】:

  • 我可以拥有多个类似乐器的按键。例如帐户、问题。
  • 固定@Amit,检查底部。这应该可以解决您的问题。
  • 让我试试
  • 我以不同的方式尝试了您的解决方案。有效。非常感谢
猜你喜欢
  • 2010-11-30
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 2010-11-09
  • 2022-09-23
  • 2019-06-22
相关资源
最近更新 更多