js转化数据结构

做一个时间段的页面,一节课30分钟。后端想要的数据结构是这样的

2018-09-17|09:00-09:30,2018-09-18|09:30-11:00,2018-09-19|10:00-11:30,2018-09-20|10:30-11:00,2018-09-21|11:00-11:30,2018-09-22|11:30-12:00

我首先做成了这样的数据结构

setArray = [
    data:2018-09-17,
    ranges:[
        ["09:00", "09:30"],
        ["09:30", "10:00"],
        ["10:30","11:30"],
        ["11:30","12:00"]
    ],
    data:2018-09-18,
    ranges:[
        ["09:00", "09:30"],
        ["09:30", "10:00"],
        ["10:30","11:30"],
        ["11:30","12:00"]
    ], 
]
var getJson =  setArray.map(d => {
                return d.date + '|' + d.ranges.map(r => r.join('-')).join('|')
            }).join(',')

通过上面的方法也成功转化成后端想要的结构了。但是后端说,如果几节课属于连续一块的,就合成一个数组开始结束时间就行了就好比上面写的

ranges:[
    ["09:00", "09:30"],
    ["09:30", "10:00"],
    ["10:30","11:30"],
    ["11:30","12:00"]
]
需要改成
ranges:[
    ["09:00", "10:00"],
     ["10:00", "12:00"],
]

求帮一下忙

阅读 2.3k
3 个回答

s = [];
for(let e of ranges){
    let v= s.pop();
    if(v&&v[1] == e[0]){
        s.push([v[0],e[1]]);
    }else{
        s.push(v,e)
    }
}
s.shift();//移除undefined
var getJson =  setArray.map(d => {
    var a = [],old = ''
    d.ranges.forEach(item=>{
        if(item[0] == old){
            a[ a.length - 1 ][1] = item[1]
        }else{
            a.push( item )
        }
        old = item[1]
    })
    return d.date + '|' + a.map(r => r.join('-')).join('|')
}).join(',')

类似要求的好像社区已经有多个类似的帖子啦,讨论的比较充分,可以参考一下。你用 “时间段” 在社区搜索。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题