【问题标题】:Lodash groupBy with momentLodash groupBy 与时刻
【发布时间】:2017-11-15 08:06:43
【问题描述】:

我正在尝试按今天、本周、本月和前几个月对一组日期进行分组。但是,在我达到这一点之前,我什至很难按月进行基本分组。

const data = [{
 campaign: "Charles",
 company_ID: "1",
 coreURL: "http://www.test77.com",
 createdAt: "2017-11-06T20:45:56.931Z",
 owner: "K7xTxu7PRDCuhFZRC",
 updatedAt: "2017-09-06T20:45:56.931Z",
 _id: "6gsb42PSSJt7PgsDG"
}, {
 campaign: "Charles",
 company_ID: "1",
 coreURL: "http://www.test66,com",
 createdAt: "2017-11-06T20:46:27.744Z",
 owner: "K7xTxu7PRDCuhFZRC",
 updatedAt: "2017-10-06T20:46:27.744Z",
 _id: "Md4wCnEsrQrWApnLS"
}, {
 campaign: "Gary",
 company_ID: "1",
 coreURL: "http://www.test55,com",
 createdAt: "2017-11-06T20:46:27.744Z",
 owner: "K7xTxu7PRDCuhFZRC",
 updatedAt: "2017-07-06T20:46:27.744Z",
 _id: "5p44uiwRgqp35YXRf"
}
];

const grouper = 'updatedAt';

let groupedData = _
  .chain(data)
  .groupBy(datum => moment(datum.grouper).format("MM")) 

编辑:但是这似乎只按“11”(今天的月份)分组

任何帮助将不胜感激

【问题讨论】:

    标签: javascript momentjs lodash


    【解决方案1】:

    datum.grouper 是 undefined,所以 moment(datum.grouper) 返回当前日期。

    您应该改用datum[grouper] 或类似_.property('updatedAt') 的东西。

    关于如何将日期划分为今天、本周、本月和其他月份的问题,请尝试以下操作:

    const data = [{
      campaign: "Charles",
      company_ID: "1",
      coreURL: "http://www.test77.com",
      createdAt: "2017-11-06T20:45:56.931Z",
      owner: "K7xTxu7PRDCuhFZRC",
      updatedAt: "2017-09-06T20:45:56.931Z",
      _id: "6gsb42PSSJt7PgsDG"
    }, {
      campaign: "Charles",
      company_ID: "1",
      coreURL: "http://www.test66,com",
      createdAt: "2017-11-06T20:46:27.744Z",
      owner: "K7xTxu7PRDCuhFZRC",
      updatedAt: "2017-10-06T20:46:27.744Z",
      _id: "Md4wCnEsrQrWApnLS"
    }, {
      campaign: "Gary",
      company_ID: "1",
      coreURL: "http://www.test55,com",
      createdAt: "2017-11-06T20:46:27.744Z",
      owner: "K7xTxu7PRDCuhFZRC",
      updatedAt: "2017-07-06T20:46:27.744Z",
      _id: "5p44uiwRgqp35YXRf"
    }, {
      campaign: "Fred",
      company_ID: "1",
      coreURL: "http://www.test55,com",
      createdAt: "2017-11-06T20:46:27.744Z",
      owner: "K7xTxu7PRDCuhFZRC",
      updatedAt: "2017-11-15T03:46:27.744Z",
      _id: "5p44uiwRgqp35YXRf"
    }, {
      campaign: "Fred",
      company_ID: "1",
      coreURL: "http://www.test55,com",
      createdAt: "2017-11-06T20:46:27.744Z",
      owner: "K7xTxu7PRDCuhFZRC",
      updatedAt: "2017-11-03T20:46:27.744Z",
      _id: "5p44uiwRgqp35YXRf"
    }, {
      campaign: "Fred",
      company_ID: "1",
      coreURL: "http://www.test55,com",
      createdAt: "2017-11-06T20:46:27.744Z",
      owner: "K7xTxu7PRDCuhFZRC",
      updatedAt: "2017-11-13T20:46:27.744Z",
      _id: "5p44uiwRgqp35YXRf"
    }, {
      campaign: "Fred",
      company_ID: "1",
      coreURL: "http://www.test55,com",
      createdAt: "2017-11-06T20:46:27.744Z",
      owner: "K7xTxu7PRDCuhFZRC",
      updatedAt: "2017-11-09T20:46:27.744Z",
      _id: "5p44uiwRgqp35YXRf"
    }];
    
    const groupProp = _.property('updatedAt');
    
    let determineGroup = value => {
      // remove '2017-11-15' to actually use current date 
      const now = moment('2017-11-15T10:00:03Z').startOf('day');
    
      if (value.isSame(now, 'day')) {
        return 'today';
      }
      if (value.isAfter(now.clone().subtract(7, 'days').startOf('day'))) {
        return 'this week';
      }
      if (value.isSame(now, 'month')) {
        return 'this month';
      }
      return value.format('MM');
    };
    
    let groupedData = _
      .chain(data)
      .groupBy(datum => determineGroup(moment(groupProp(datum))))
      .value()
    
    console.log(groupedData);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.2/moment.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

    【讨论】:

    • 非常感谢。您对如何有条件地分组有任何想法(即今天,本周,本月):-)
    • @NickWild “本周”会包括“今天”项目还是排除它们?您会将“本周”定义为“过去 7 天”还是“自一周中某一天(星期日/星期一)以来的时间”?关于“本月”的类似问题。
    • 本周将排除今天,可能是过去 7 天而不是日历周,但本月将是实际月份(但不包括过去 7 天),然后其他历史月份将只是常规日历个月。谢谢!
    • @NickWild 好的,请查看我的更新答案。我使用了一个函数将日期分类到您指定的组中。
    • 那是完美的。感谢您花时间编写此代码
    【解决方案2】:
    let groupedData = _
    .chain(data)
    .groupBy(record => moment(record.updatedAt).format("MM"))
    .value();
    

    【讨论】:

      【解决方案3】:

      如果您只需要当前月、日、年,也许您可​​以使用过滤器。

      const today = _.filter(data, d => moment(d.updatedAt).isSame(moment(), 'day'));
      console.log(today);
      
      const thisWeek = _.filter(data, d => moment(d.updatedAt).isSame(moment(), 'week'));
      console.log(thisWeek);
      
      const thisMonth = _.filter(data, d => moment(d.updatedAt).isSame(moment(), 'month'));
      console.log(thisMonth);
      

      或 groupBy 如果您需要所有月份(所有年份)

      const byMonth = _.groupBy(data, d => moment(d.updatedAt).month());
      console.log(byMonth);
      

      https://jsbin.com/xidido/edit?js,console

      【讨论】:

        猜你喜欢
        • 2018-03-18
        • 2018-03-22
        • 1970-01-01
        • 1970-01-01
        • 2021-10-15
        • 1970-01-01
        • 1970-01-01
        • 2016-01-05
        • 1970-01-01
        相关资源
        最近更新 更多