根据输入字段从普通对象数组创建嵌套的 sum json 对象

我正在构建一个 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 slicer_and_dicer(obj, arr){

......

}

其中 obj 是解析后的 FIX 对象,数组是您要将对象嵌套到的字段。数组中的元素顺序很重要。例如


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

将给出嵌套的 json 对象的输出,该对象对下面的 totalnv = lastpx * lastqty 求和:


{

'Client1':{

           '1234.T':{ 'TotalNV': 1250000 },

           '1235.T':{ 'TotalNV': 600000 }

          },

'Client2':{

           '1234.T':{ 'TotalNV': 1825000 },

           '1235.T':{ 'TotalNV': 1400000 }

          }

}

如果数组中的给定元素是已知的,我可以构建一个函数来创建一个类似的对象,但如果它变成动态的,例如添加一个新级别的“Side”


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

有人可以分享解决方案吗?谢谢!


蓝山帝景
浏览 113回答 1
1回答

PIPIONE

以下代码将执行您想要的操作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']));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript