压缩javascript数组链接记录的最有效方法是什么?

时间:2013-12-22 01:32:21

标签: javascript

我有一个简单的javascript对象列表,每个对象都有一个start和end属性(datetime)

日期按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

我应该如何使用vanilla javascript来解决这个问题?

更新

这些记录在我执行此壁球之前已经过排序。

我不希望任何东西填补空白(只是把它们留下来)

这绝不会超过早上7点到晚上7点的日期范围(所以你可以忽略午夜问题)

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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的新手,所以评论非常感谢。

答案 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>