规范化日期并计算循环中的开始和结束

时间:2017-05-24 04:17:44

标签: javascript date ecmascript-6 lodash

我很难弄清楚如何转换涉及日期的一组数据。我无法控制后端我有这组数据

[
{id:123,date:'2017-05-01',name:'Sam'},
{id:123,date:'2017-05-02',name:'Sam'},
{id:123,date:'2017-05-03',name:'Sam'},
{id:456,date:'2017-05-02',name:'Kate'},
{id:456,date:'2017-05-03',name:'Kate'},
{id:456,date:'2017-05-04',name:'Kate'},
{id:456,date:'2017-05-05',name:'Kate'},
{id:456,date:'2017-05-06',name:'Kate'}
...
...
]

我怎样才能把它变成这个?

[{name:'Same',start_date:'2017-05-01',end_date:'2017-05-03',total_days:3},
{name:'Kate',start_date:'2017-05-02',end_date:'2017-05-06',total_days:5}]

1 个答案:

答案 0 :(得分:0)

您可以首先获取唯一名称,然后map使用已过滤数组的这些名称,按日期排序:

const arr = [
{id:123,date:'2017-05-01',name:'Sam'},
{id:123,date:'2017-05-02',name:'Sam'},
{id:123,date:'2017-05-03',name:'Sam'},
{id:456,date:'2017-05-02',name:'Kate'},
{id:456,date:'2017-05-03',name:'Kate'},
{id:456,date:'2017-05-04',name:'Kate'},
{id:456,date:'2017-05-05',name:'Kate'},
{id:456,date:'2017-05-06',name:'Kate'}
];

const res = [...new Set(arr.map(({name}) => name))] // get unique names with Set and convert it into array
  .map(n => { // for each name
    // filter array by name and sort by date
    const el = arr.filter(e => e.name === n).sort((a, b) => new Date(a.date) - new Date(b.date));
    return {
      name: n,
      total_days: el.length,
      start_date: (el.length) ? el.shift().date : null, // date in first array item
      end_date: (el.length) ? el.pop().date : null // date in last array item
    }
  })

console.log(res)