【问题标题】:Grouping into objects using lodash and moment with date as key使用 lodash 和 moment 将日期作为键分组到对象中
【发布时间】:2020-12-18 07:38:38
【问题描述】:

我正在尝试将数组中的一些数据放入对象中,其中数据根据它们所属的月份进行分组,以便每个对象都将 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",
                "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"
            },
            ...
        ]
    },
    "2020-07-01T00:00:00.000Z": {
        "data": [
            {
                "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"
            },
            ...
        ]
    }
}

到目前为止,这是我使用 lodash 和 moment 尝试过的,但是日期键的格式不正确,我不得不使用附加变量和 for 循环,所以我想知道是否有更好的方法在使用或不使用lodash/moment的情况下保持日期键正确的同时实现这一点?如果有人能帮助我解决这个问题,我将不胜感激,因为我已经坚持了很长一段时间。

  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",
                "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"
            },
            ...
        ]
    },
    "Wed Jul 01 2020 00:00:00 GMT+0800": {
        "data": [
            {
                "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"
            },
            ...
        ]
    }
}

【问题讨论】:

    标签: javascript date object momentjs lodash


    【解决方案1】:

    您可以使用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>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多