Javascript 如何根据包含过去12个月的预定义数组将值映射到数组

Javascript 如何根据包含过去12个月的预定义数组将值映射到数组,javascript,Javascript,我有一个数组,其中包含数百个交易对象,如下所示: 输入: [{ "trades": { "model": "Trades_Information" "fields": { "orderCloseTime": "2019-03-19T16:20:56", "orderOpenPrice": "1.40000", "orderClosePrice": "1.4400

我有一个数组,其中包含数百个
交易
对象,如下所示:

输入:

[{
    "trades": {
        "model": "Trades_Information"
        "fields": {
                "orderCloseTime": "2019-03-19T16:20:56",
                "orderOpenPrice": "1.40000",
                "orderClosePrice": "1.44000",
                "orderProfit": "75",
                "orderLots": "1.4"
        },
        [...]
}]
现在,我想循环所有对象,并将结果(循环中包括一些计算)映射到新数组,新数组将更新
Apexchart

对我来说,现在最棘手的部分是动态地获得过去12个月的正确映射,因为每个新数组必须按照我创建的过去12个月数组的正确顺序包含值,如下所示:

var date = new Date();
var lastMonths = [],
    monthNames = ['Dec', 'Nov', 'Oct', 'Sep', 'Aug', 'Jul', 'Jun', 'May', 'Apr', 'Mar', 'Feb', 'Jan'];
for (var i = 0; i < 12; i++) {
    lastMonths.push(monthNames[date.getMonth()]);
    date.setMonth(date.getMonth() - 1);
}

console.log(lastMonths);

// ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
  • 可能会创建一个嵌套对象,并在循环时填充该对象,使所有值都位于一个主对象中,并在循环完成后在此主对象中构建
    apexchart
    所需的数组
  • 为每个月构建12x4个循环,包含每次计算,然后将结果相加,得到包含在4个数组中的每月总和(这将导致大量代码)

期待您的想法,享受假期

您确实可以按照您的建议创建数组。诚然,将三个值(月、利润、产量)组合到一个对象中更为面向对象,但由于apexChart希望数组中有单独的值,因此直接使用该结构是有意义的

您可以使用一些
splice
magic来创建月份数组

让tradesTotal=[{
“行业”:{
“模型”:“交易信息”,
“字段”:{
“订单关闭时间”:“2019-03-19T16:20:56”,
“订单利润”:“75”,
“订单批次”:“1.4”
},
}
}];
让我们现在=新日期();
现在。设置日期(32);//去下个月
现在。设置日期(1);//设置为下个月的第一天
现在.setUTCHours(0,0,0,0);//清除时间
让firstMonth=now.getMonth();
让最后几个月=['1月'、'2月'、'3月'、'4月'、'5月'、'6月'、'7月'、'8月'、'9月'、'10月'、'11月'、'12月'];
lastMonths.splice(0,0,…lastMonths.splice(firstMonth));//旋转
设netProfitMonth=Array(12)。填充(0);
设totalVolumeMonth=数组(12)。填充(0);
让克隆=新日期(现在);
clone.setFullYear(现在是.getFullYear()-1);
让minDateString=clone.toJSON().slice(0,10);
for(让tradesTotal的{trades:{fields:{orderCloseTime,orderProfit,orderLots}}}}}{
如果(orderCloseTimeconsole.log(…总卷数)我将以不同的方式处理此问题。我将月份数组保持为正常顺序。(1月1日至去年12月)。这将使其他阵列的计算更容易。获取从日期开始的月份,将其用作填充数组的索引。然后计算当前月份的轮换数量,然后轮换阵列

var交易风险=[{
“行业”:{
“模型”:“交易信息”,
“字段”:{
“订单关闭时间”:“2019-03-19T16:20:56”,
“orderOpenPrice”:“1.40000”,
“订单利润”:“75”,
“订单批次”:“1.4”
}
}
}, {
“行业”:{
“模型”:“交易信息”,
“字段”:{
“订单关闭时间”:“2019-04-19T16:20:56”,
“orderOpenPrice”:“1.40000”,
“订单利润”:“75”,
“订单批次”:“1.4”
}
}
}, {
“行业”:{
“模型”:“交易信息”,
“字段”:{
“订单关闭时间”:“2019-03-19T16:20:56”,
“orderOpenPrice”:“1.40000”,
“订单利润”:“75”,
“订单批次”:“1.4”
}
}
}, {
“行业”:{
“模型”:“交易信息”,
“字段”:{
“订单关闭时间”:“2019-05-19T16:20:56”,
“orderOpenPrice”:“1.40000”,
“订单利润”:“75”,
“订单批次”:“1.4”
}
}
}, {
“行业”:{
“模型”:“交易信息”,
“字段”:{
“订单关闭时间”:“2019-11-19T16:20:56”,
“orderOpenPrice”:“1.40000”,
“订单利润”:“75”,
“订单批次”:“1.4”
}
}
}, {
“行业”:{
“模型”:“交易信息”,
“字段”:{
“订单关闭时间”:“2019-12-19T16:20:56”,
“orderOpenPrice”:“1.40000”,
“订单利润”:“75”,
“订单批次”:“1.4”
}
}
}];
//取自https://stackoverflow.com/a/1985471/12354911
Array.prototype.rotate=(函数(){
var unshift=Array.prototype.unshift,
接头=Array.prototype.splice;
返回函数(计数){
var len=this.length>>>0,
计数=计数>>0;
unshift.apply(这个,splice.call(这个,计数%len,len));
归还这个;
};
})();
施工月数=[“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”];//使用此功能并继续订购,以备以后使用。
//由于大小已清除,因此请使用大小创建数组
//用0填充它们以使其更容易拼合
NetPipsMonth=数组(12)。填充(0);
NetProfitMonth=阵列(12)。填充(0);
TotalVolumeMonth=数组(12)。填充(0);
TotalTradesMonth=数组(12)。填充(0);
tradesArr.forEach(t=>{
const fields=t.trades.fields;
const ix=新日期(fields.orderCloseTime).getMonth();//零索引月份
NetProfitMonth[ix]+=+fields.orderProfit;
TotalVolumeMonth[ix]+=+fields.orderLots;
//延续
});
//假设我们在五月,我们希望五月是数组中的最后一项
//Date().getMonth()给了我们4(零索引)
常数旋转=-((12-4)-1);//我们需要向右旋转7
月。轮换(轮换);
NetProfitMonth.旋转(旋转);
总体积月旋转(旋转);

日志(月、NetProfitMonth、TotalVolumeMonth)我喜欢这种方法,但结果似乎“延迟”了一个月?“三月应该有150点利润,而不是75点利润。”我错了
getMonth
返回0个索引月份。我猜是1。不用担心,非常感谢。我会接受你的答案而不是其他答案(这也很好),因为你的答案对我这个JS新手来说更容易理解。
// Arrays needed for Apexchart
NetPipsMonth = [];
NetProfitMonth = [];
TotalVolumeMonth = [];
TotalTradesMonth = [];
lastMonths = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

// Loop all trades in trades-object
for (var i = 0; i < tradesTotal; i++) {

    // Filter all trades by closed ones
    closeTime = trades[i].fields.orderCloseTime;
    if (closeTime != null) {

    // Make some calculations that output one value per new array per trade object


    // Push the results to each array in right order according to lastMonths array
    // Mapping with `orderCloseTime`

    }
}
      lastMonths = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
  NetProfitMonth = [     ,      ,  75  ,      ,      ,];
TotalVolumeMonth = [     ,      ,  1.4 ,      ,  ... ,];