2016-04-30 5 views
3

мне нужно сгруппировать коллекцию объектов по дате:Группировка элементов в машинопись с lodash

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

Во-первых, я объявил мои занятия:

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); }); 

ответ

3

Вы можете использовать метод _.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>');
<script src="https://cdn.jsdelivr.net/lodash/4.11.2/lodash.min.js"></script>

Вот версия 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>');
<script src="https://cdn.jsdelivr.net/lodash/4.11.2/lodash.min.js"></script>

+1

Я получил это работает в JS, мой вопрос заключается в написании его в машинописном – jlp

1

Если у вас есть типизации оптоволоконный r lodash (для более новых версий typescript do npm i --save-dev @types/lodash), методы типа _.groupBy или _.keyBy принимают тип generics.

Например: _.groupBy<TypeEachGroupCarries>(expression) будет возвращать массив массивов, содержащих элементы типа TypeEachGroupCarries.

-1

Зачем использовать библиотеку, когда у вас уже есть все инструменты? :)

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] 
    } 
})  

Смотреть это работает в машинописи playground

Смежные вопросы