扁平化 JSON 数据的最佳方法



我有如下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"
}]

有没有有效的方法来扁平化它。阵列的长度可以非常大,只有 10 千。

谢谢

如果是静态键,只需提取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; }

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

相关内容

最新更新