为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

蓝山帝景 2021-10-29 15:10:12
我正在构建一个 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'])有人可以分享解决方案吗?谢谢!
查看完整描述

1 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

以下代码将执行您想要的操作


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']));


查看完整回答
反对 回复 2021-10-29
  • 1 回答
  • 0 关注
  • 112 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信