使用lodash和以日期为键的时刻分组为对象

问题描述

我正在尝试将数组中的一些数据放入对象中,这些数据根据它们所属的月份进行分组,以便每个对象都将JavaScript Date对象中的月份作为键。

[
    {
        "date": "2020-08-25T00:00:00.000Z","open": "498.7900","high": "500.7172","low": "492.2100","close": "499.3000","adjusted close": "499.3000","volume": "52873947"
    },{
        "date": "2020-08-24T00:00:00.000Z","open": "514.7900","high": "515.1400","low": "495.7450","close": "503.4300","adjusted close": "503.4300","volume": "86484442"
    },...
    {
        "date": "2020-07-31T00:00:00.000Z","open": "411.5350","high": "425.6600","low": "403.3000","close": "425.0400","adjusted close": "424.2573","volume": "93573867"
    },{
        "date": "2020-07-30T00:00:00.000Z","open": "376.7500","high": "385.1900","low": "375.0700","close": "384.7600","adjusted close": "384.0514","volume": "39532505"
    },...
]

预期输出

{
    "2020-08-01T00:00:00.000Z": {
        "data": [
            {
                "date": "2020-08-25T00:00:00.000Z","volume": "52873947"
            },{
                "date": "2020-08-24T00:00:00.000Z","volume": "86484442"
            },...
        ]
    },"2020-07-01T00:00:00.000Z": {
        "data": [
            {
                "date": "2020-07-31T00:00:00.000Z","volume": "93573867"
            },{
                "date": "2020-07-30T00:00:00.000Z","volume": "39532505"
            },...
        ]
    }
}

这是到目前为止我使用lodash和moment进行的尝试,但是date键的格式不正确,我不得不使用其他变量和for循环,所以我想知道是否有更好的方法如何在保持日期键正确无误的情况下实现这一点?如果有人在这个问题上困扰了我一段时间,那么如果有人能帮助我,我将非常感激。

  let result = _.chain(arr)
    .groupBy(arr=>
      moment(arr['date'],'YYYY/MM/DD').startOf(
        'month'
      )
    )
    .value()
  let finalObj = {};
  for (const [key,val] of Object.entries(result)) {
    finalObj[key] = { data: val };
  }

当前输出-finalObj:

{
    "Sat Aug 01 2020 00:00:00 GMT+0800": {
        "data": [
            {
                "date": "2020-08-25T00:00:00.000Z","Wed Jul 01 2020 00:00:00 GMT+0800": {
        "data": [
            {
                "date": "2020-07-31T00:00:00.000Z",...
        ]
    }
}

解决方法

您可以使用utc()format()来固定月份密钥,并使用mapValues以lodash样式执行最后的突变:

let arr = [{"date": "2020-08-25T00:00:00.000Z","open": "498.7900","high": "500.7172","low": "492.2100","close": "499.3000","adjusted close": "499.3000","volume": "52873947"},{"date": "2020-08-24T00:00:00.000Z","open": "514.7900","high": "515.1400","low": "495.7450","close": "503.4300","adjusted close": "503.4300","volume": "86484442"},{"date": "2020-07-31T00:00:00.000Z","open": "411.5350","high": "425.6600","low": "403.3000","close": "425.0400","adjusted close": "424.2573","volume": "93573867"},{"date": "2020-07-30T00:00:00.000Z","open": "376.7500","high": "385.1900","low": "375.0700","close": "384.7600","adjusted close": "384.0514","volume": "39532505"},];

let result = _.chain(arr)
    .groupBy(arr=>
      moment(arr['date'],'YYYY/MM/DD').utc().startOf(
        'month'
      ).format()
    )
    .mapValues(data => ({data})) 
    .value();
    
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.15.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>