2013-12-22 48 views
1

我有JavaScript对象的简单列表,每一个单个的开始和结束属性(日期时间)压缩链接记录的JavaScript数组最有效的方法是什么?

日期以15分钟为增量进行分组,所以我有这样

01/01/1999 07:00:00 - 07:15:00 
01/01/1999 07:15:00 - 07:30:00 
01/01/1999 07:30:00 - 07:45:00 
01/01/1999 09:00:00 - 09:15:00 
//and so on 

的数据结构当一个时隙被填满时可能会出现间隙,所以在上面你注意到从7点45分到9点这个数组缺少数据。我想要一个有效的方式来循环这个数组,并结合这些间隙之间的所有记录。

对于上述输入

01/01/1999 07:00:00 - 07:45:00 
01/01/1999 09:00:00 - 09:15:00 
//and so on 

所需的输出我应该如何使用接近香草JavaScript的这个问题呢?

更新

之前,我执行此壁球这些记录进行排序。

我什么都不想,填补国内空白(刚刚离开他们出去)

这将永远不会超越早上7点 - 晚上7点日期范围(这样你就可以忽略午夜问题)

+1

期间排序? –

+0

你想要一个代码来填补这个空白?像那样:8:00:00然后8:15:00等等...? –

+0

如果他们排序,只需比较prev结束与当前开始,如果他们相等设置前一个结束当前结束。 –

回答

2

jsFidle Demo

您将需要将日期字符串拆分为“”,然后在循环时执行一些逻辑。

var arr = []; 
arr.push("01/01/1999 07:00:00 - 07:15:00"); 
arr.push("01/01/1999 07:15:00 - 07:30:00"); 
arr.push("01/01/1999 07:30:00 - 07:45:00"); 
arr.push("01/01/1999 09:00:00 - 09:15:00"); 

function transform(input){ 
var output = []; 
var year = input[0].split(" ")[0]; 
var firstStart; 
var previousEnd; 
for(var i = 0, len = input.length; i < len; i++){ 
    var pieces = input[i].split(" "); 
    var start = pieces[1]; 
    var end = pieces[3]; 
    if(typeof(firstStart) == "undefined"){ 
    firstStart = start; 
    previousEnd = end; 
    }else{ 
    if(start == previousEnd){ 
     previousEnd = end; 
    }else{ 
     output.push(year+" "+firstStart+" - "+previousEnd); 
     firstStart = start; 
     previousEnd = end; 
    } 
    } 
    if(i == (len-1)){ 
     output.push(year+" "+firstStart+" - "+previousEnd); 
    } 
} 
console.log(input); 
console.log(output); 
return output; 
} 

arr = transform(arr); 
+0

优秀!感谢您投入时间来完成这一切! –

+0

为什么这么难? http://jsfiddle.net/oceog/UULYV/2/ –

1

更简单的方法:

<html> 
<head> 
<meta http-equiv="content-type" content="text/html;charset=ISO-8859-1"/> 
<script type="text/javascript"> 
window.onload = function(){ 
var div = document.getElementById("div1"), 
    arr = new Array(
     "01/01/1999 07:00:00 - 07:15:00", 
     "01/01/1999 07:15:00 - 07:30:00", 
     "01/01/1999 07:30:00 - 07:45:00", 
     "01/01/1999 09:00:00 - 09:15:00", 
     "01/01/1999 09:15:00 - 09:30:00", 
     "01/01/1999 09:30:00 - 09:45:00", 
     "01/01/1999 10:15:00 - 10:30:00", 
     "01/01/1999 10:30:00 - 10:45:00" 
     ), 
    i, 
    len = arr.length, 
    start = arr[0].substr(0, 19); 
    for(i = 1; i < len; i++){ 
     if(arr[i-1].substr(22, 8) != arr[i].substr(11, 8)){ 
     div.innerHTML += "<p>"+start+" - "+arr[i-1].substr(22, 8)+"</p>"; 
     start = arr[i].substr(0, 19); 
     } 
    } 
    div.innerHTML += "<p>"+start+" - "+arr[len-1].substr(22, 8)+"</p>"; 
} 
</script> 
</head> 
<body> 
<div id="div1"></div> 
</body> 
</html> 
+0

哪里是01/01/1999 07:00:00? http://jsbin.com/IfeFENa/1/edit –

+0

检查这也... http://jsbin.com/IfeFENa/2/edit –

+0

@eicto非常感谢你指出我的错误。请检查此... http://jsbin.com/IfeFENa/5/edit。 – 2013-12-22 02:57:55

2

这里是我想象的你粗糙的结构:

Period = function(start, end){ 
    this.start : // some date obj, stored as milliseconds since 01/01/1970 
    this.end : // some later date obj 
}; 

var periods = [new Period(s1, e1), new Period(s2, e2), ..., new Period(sn, en)]; 
periods.sort(someSortingFunction); 

如果你的结构是这样的,那么你可以使用过滤器迭代器功能如下:

var filteredArray = periods.filter(function(period, index, periods) { 
    // 900000 ms in 15 min 
    return (index === 0) ? true : (period.start - periods[index - 1].end) > 900000; 
} 

Array.filter返回给定的回调函数返回true的元素数组。因此,在这种情况下,如果两个元素的间隔小于或等于15分钟,则不会返回。

我是JS新手,非常感谢您的意见。

相关问题