【问题标题】:Group items in Typescript with lodash使用 lodash 对 Typescript 中的项目进行分组
【发布时间】:2016-08-25 15:38:48
【问题描述】:

我需要按日期对一组对象进行分组:

var meetings =
[
   {date:"2001-01-01 13:00", place:"park"},
   {date:"2001-01-01 14:00", place:"school"},
   {date:"2001-01-02 11:00", place:"house"}
];

这样就变成了:

var groupedMeetings = 
[
   {
      day:"2001-01-01", 
      meetings: 
      [
         {date:"2001-01-01 13:00", place:"park"},
         {date:"2001-01-01 14:00", place:"school"}
      ]
   },
   {
      day:"2001-01-02", 
      meetings: 
      [
         {date:"2001-01-02 11:00", place:"house"}
      ]
   }
]

我可以用 _.groupBy 和 _.map 对它们进行分组

var g = _.groupBy(meetings, function(i){return getDatePart(i.date);});
var groupedMeetings  = _.map(g, function(items,key){return {day:key, meetings:items};});

但我在使用 https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/lodash/lodash.d.ts 的 Typescript 中做同样的事情时遇到问题

首先,我声明了我的类:

class Meeting
    {
       date: Date,
       place: Meeting[]
    }
class GroupedMeeting
    {
      constructor(private day: Date, private meetings: Meeting[]) {}
    }

现在我不知道使用哪个 groupBy 重载?以及如何将其映射到分组项目列表?

var grouped: _.Dictionary<Meeting[]> = _.groupBy(meetings, (i: Meeting) => { return this.getDatePart(i.date); });

var groupedMeetings : GroupedMeeting[] = _.map(grouped, (items: Meeting[], key: Date) => { return new GroupedMeeting (key, items); });

【问题讨论】:

    标签: typescript lodash definitelytyped


    【解决方案1】:

    您可以使用_.groupBy() 方法并添加一个回调,该回调返回您需要对其进行分组的值,即日期的年、月、日部分。然后您可以使用_.map() 设置所需的值。

    下面的例子使用了 ES6:

    var meetings =
    [
       {date:"2001-01-01 13:00", place:"park"},
       {date:"2001-01-01 14:00", place:"school"},
       {date:"2001-01-02 11:00", place:"house"}
    ];
    
    var result = _(meetings)
      .groupBy(meeting => meeting.date.split(' ').shift())
      .map((meetings, day) => ({ day, meetings }))
      .value();
    
    document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
    &lt;script src="https://cdn.jsdelivr.net/lodash/4.11.2/lodash.min.js"&gt;&lt;/script&gt;

    这是 ES5 版本:

    var meetings =
    [
       {date:"2001-01-01 13:00", place:"park"},
       {date:"2001-01-01 14:00", place:"school"},
       {date:"2001-01-02 11:00", place:"house"}
    ];
    
    var result = _(meetings)
      .groupBy(function(meeting) { return meeting.date.split(' ').shift(); })
      .map(function(meetings, day) { return { day: day, meetings: meetings }; })
      .value();
    
    document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
    &lt;script src="https://cdn.jsdelivr.net/lodash/4.11.2/lodash.min.js"&gt;&lt;/script&gt;

    【讨论】:

    • 我在 JS 中工作,我的问题是用 Typescript 编写它
    【解决方案2】:

    如果您有 lodash 的类型(对于较新版本的 typescript,请执行 npm i --save-dev @types/lodash),像 _.groupBy 或 _.keyBy 这样的方法接受泛型类型。

    例如:_.groupBy&lt;TypeEachGroupCarries&gt;(expression) 将返回一个数组数组,其中包含 TypeEachGroupCarries 类型的项目。

    【讨论】:

      【解决方案3】:

      既然您已经拥有所有工具,为什么还要使用库? :)

      const dateMap  = meetings
          .reduce(
          (m, v) => {
              const day = v.date.substring(0,10)
              const entry = m[day]
              if (typeof entry === 'undefined') {
                  m[day] = [v] 
              }
              else {
                  entry.push(v)
              }
              return m
          },
          {}    
      )
      
      const groupedMeetings = Object.keys(dateMap).map(d => {
          return {
              day: d,
              meetings: dateMap[d]
          }
      })    
      

      查看它在 Typescript 中运行playground

      【讨论】:

        猜你喜欢
        • 2019-06-28
        • 2021-10-23
        • 2021-05-04
        • 1970-01-01
        • 1970-01-01
        • 2018-01-09
        • 2022-01-12
        • 2019-08-31
        • 1970-01-01
        相关资源
        最近更新 更多