挤压链接记录的javascript数组最有效的方法是什么?
我有一个简单的javascript对象列表,每个对象都有一个开始和结束属性datetime 日期以15分钟为增量分组,所以我有一个这样的数据结构挤压链接记录的javascript数组最有效的方法是什么?,javascript,Javascript,我有一个简单的javascript对象列表,每个对象都有一个开始和结束属性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: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点的日期范围,因此您可以忽略午夜问题
您需要将日期字符串按拆分,然后在循环时执行一些逻辑
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);
您需要将日期字符串按拆分,然后在循环时执行一些逻辑
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);
更简单的方法是:
<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>
更简单的方法是:
<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>
以下是我想象中的你的粗略结构:
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);
如果您的结构是这样的,那么您可以像这样使用filter iterator函数:
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新手,所以非常感谢您的评论 以下是我想象中的你的大致结构:
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);
如果您的结构是这样的,那么您可以像这样使用filter iterator函数:
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新手,所以非常感谢您的评论 句点已排序?是否需要代码来填补空白?比如:8:00:00然后8:15:00等等…?如果它们排序,只需比较上一个结束和当前开始,如果它们相等,则将上一个结束设置为当前结束。顺便说一句,您的格式不包括时段通过午夜的情况。最好使用datetime或unixtime,不要担心。我更新了问题以涵盖这些评论-谢谢!句点已排序?是否需要代码来填补空白?比如:8:00:00然后8:15:00等等…?如果它们排序,只需比较上一个结束和当前开始,如果它们相等,则将上一个结束设置为当前结束。顺便说一句,您的格式不包括时段通过午夜的情况。最好使用datetime或unixtime,不要担心。我更新了问题以涵盖这些评论-谢谢!杰出的谢谢你花时间来解决这个问题!杰出的谢谢你花时间来解决这个问题@我非常感谢你指出我的错误。请检查这个@我非常感谢你指出我的错误。请检查这个。