【问题标题】:normalize date and calculate start and end in loop标准化日期并循环计算开始和结束
【发布时间】:2017-05-24 04:17:43
【问题描述】:

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

[
{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}]

【问题讨论】:

  • 您可能会遍历对象数组并计算出特定 id 的第一个和最后一个,然后得到两者之间的天数差异。在差异部分之前,您无需担心日期。你试过什么?

标签: javascript date ecmascript-6 lodash


【解决方案1】:

你可以先得到唯一的名字,然后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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    相关资源
    最近更新 更多