簡體   English   中英

根據輸入字段從對象的普通數組創建嵌套總和 json object

[英]create nested sum json object from plain array of objects based on input fields

我正在構建一個 UI 以允許用戶將一些 FIX 消息數據切片和切塊到一些 d3 圖表中。 FIX 消息帶有一些字段和值對,因此我將它們處理成包含這些對的對象數組。 例如

let obj = [
{'8': 'FIX.4.2', 'Account': 'Client1', 'Symbol': '1234.T', 'Side': '1', 'LastPx': 6000, 'LastQty': 100},
{'8': 'FIX.4.2', 'Account': 'Client2', 'Symbol': '1235.T', 'Side': '1', 'LastPx': 7000, 'LastQty': 200},
{'8': 'FIX.4.2', 'Account': 'Client1', 'Symbol': '1234.T', 'Side': '2', 'LastPx': 4000, 'LastQty': 50},
{'8': 'FIX.4.2', 'Account': 'Client2', 'Symbol': '1234.T', 'Side': '2', 'LastPx': 5000, 'LastQty': 200},
{'8': 'FIX.4.2', 'Account': 'Client1', 'Symbol': '1234.T', 'Side': '5', 'LastPx': 4500, 'LastQty': 100},
{'8': 'FIX.4.2', 'Account': 'Client1', 'Symbol': '1235.T', 'Side': '5', 'LastPx': 6000, 'LastQty': 100},
{'8': 'FIX.4.2', 'Account': 'Client2', 'Symbol': '1234.T', 'Side': '5', 'LastPx': 5500, 'LastQty': 150}
]

當我想擁有這樣一個允許以下輸入和輸出的 function 時,它變得具有挑戰性:

function slicer_and_dicer(obj, arr){
......
}

其中 obj 是解析后的 FIX object,數組是您要嵌套 object 的字段。 數組中的元素順序很重要。 例如

slicer_and_dicer(obj, ['Account', 'Symbol'])

將給出嵌套 json object 的 output ,其中總和如下:

{
'Client1':{
           '1234.T':{ 'TotalNV': 1250000 },
           '1235.T':{ 'TotalNV': 600000 }
          },
'Client2':{
           '1234.T':{ 'TotalNV': 1825000 },
           '1235.T':{ 'TotalNV': 1400000 }
          }
}

如果數組中的給定元素是已知的,我可以構建一個 function 來創建一個類似的 object,但如果它變成動態的,例如添加一個新級別的 'Side'

slicer_and_dicer(obj, ['Account', 'Symbol', 'Side'])

有人可以分享解決方案嗎? 謝謝!

以下代碼將執行您想要的操作

 let obj = [ {'8': 'FIX.4.2', 'Account': 'Client1', 'Symbol': '1234.T', 'Side': '1', 'LastPx': 6000, 'LastQty': 100}, {'8': 'FIX.4.2', 'Account': 'Client2', 'Symbol': '1235.T', 'Side': '1', 'LastPx': 7000, 'LastQty': 200}, {'8': 'FIX.4.2', 'Account': 'Client1', 'Symbol': '1234.T', 'Side': '2', 'LastPx': 4000, 'LastQty': 50}, {'8': 'FIX.4.2', 'Account': 'Client2', 'Symbol': '1234.T', 'Side': '2', 'LastPx': 5000, 'LastQty': 200}, {'8': 'FIX.4.2', 'Account': 'Client1', 'Symbol': '1234.T', 'Side': '5', 'LastPx': 4500, 'LastQty': 100}, {'8': 'FIX.4.2', 'Account': 'Client1', 'Symbol': '1235.T', 'Side': '5', 'LastPx': 6000, 'LastQty': 100}, {'8': 'FIX.4.2', 'Account': 'Client2', 'Symbol': '1234.T', 'Side': '5', 'LastPx': 5500, 'LastQty': 150} ]; function slicer_and_dicer(obj, arr) { let ret = {}; obj.forEach(o => { const e = arr.reduce((r, k) => (r[o[k]] = r[o[k]] || {}), ret); e.TotalNV = (e.TotalNV || 0) + o.LastPx * o.LastQty; }); return ret; } console.log(slicer_and_dicer(obj, ['Account', 'Symbol'])); console.log(slicer_and_dicer(obj, ['Account', 'Symbol', 'Side']));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM