Javascript 所选日期的短日期范围复选框

Javascript 所选日期的短日期范围复选框,javascript,jquery,arrays,datetime,Javascript,Jquery,Arrays,Datetime,我们有一组复选框,被标识为日期复选框。这些被称为登记日期。签出日期大于签入日期1。例如,如果入住日期为2017年9月24日,则结账日期为2017年9月25日 因此,如果选择了连续日期,我们试图获得较短的日期范围,例如,如果我们有四个日期2017年9月24日、2017年9月25日、2017年9月26日、2017年9月27日。如果我们选择2017年9月24日,则入住日期为2017年9月24日,结帐日期为2017年9月25日。但如果我们选择24和25,26,那么在数组中我们有三个值 checkinda

我们有一组复选框,被标识为日期复选框。这些被称为登记日期。签出日期大于签入日期1。例如,如果入住日期为2017年9月24日,则结账日期为2017年9月25日

因此,如果选择了连续日期,我们试图获得较短的日期范围,例如,如果我们有四个日期2017年9月24日、2017年9月25日、2017年9月26日、2017年9月27日。如果我们选择2017年9月24日,则入住日期为2017年9月24日,结帐日期为2017年9月25日。但如果我们选择24和25,26,那么在数组中我们有三个值

checkindat:"24/09/2017",checkouts:"25/09/2017"

因此,我们希望如果日期按顺序排列,那么它将显示入住日期为2017年0月24日,结账日期为2017年9月27日。但如果我们取消检查日期,那么它现在就可以正常工作了

这是我在

var alreadycheckin=[];
$(“输入[class='check htcheck']:复选框”).change(函数(){
var roomids=$(this.attr(“roomid”);
checkindat=$(this.attr(“name”);
var new_dates=时刻(勾选日期,“DD.MM.YYYY”);
var checkid=新的日期。格式('DD-MM-YYYY');
//如果($(this).is(“:checked”))
{
var html='';
arr=[];
var roomcods=$(this.attr(“值”);
var roomids=$(this.attr(“roomid”);
checkindat=$(this.attr(“name”);
var new_dates=时刻(勾选日期,“DD.MM.YYYY”);
var checkid=新的日期。格式('DD-MM-YYYY');
//console.log(checkid);
var checkout=新日期。添加(1,'天')。格式('DD/MM/YYYY');
var roomcodes=$(this.attr(“值”);
var uniq=roomids+''''.'+'name+'.''+'checkindat;
uniq=uniq.split(“/”).join(“”).split(“”).join(“”);
var uniqs='';
//console.log($(#aa+roomids));
//alreadycheckin.push({roomids:roomids,checkindat:checkindat,checkout:checkout});
var arrElement={
室友:室友,
checkindat:checkindat,
退房:退房
};
如果($(this).is(“:checked”)){
//alreadycheckin[uniq]={roomids:roomids,checkindat:checkindat,checkout:checkout};
已检查推送(拖欠);
}否则{
var index1=arr.indexOf(arrElement);
alreadycheckin.剪接(index1,1);
}
var tmpAlreadycheckin=[];
//tmpAlreadycheckin=alreadycheckin.slice(0);
对于(var i=0;i0){
if(alreadycheckin[i-1]的类型!=“未定义”| | alreadycheckin[i-1]!=null){
if(alreadycheckin[i].checkout==alreadycheckin[i-1].checkindat){
控制台日志(“111”);
var arrElement1={
室友:室友,
checkindat:alreadycheckin[i].checkindat,
签出:alreadycheckin[i-1]。签出
};
tmpAlreadycheckin.push(欠款项1);
//tmpalReadyCheckkin[i]。签出=tmpalReadyCheckkin[i+1]。签出;
//tmpAlreadycheckin.拼接(i+1,1);
}否则{
控制台日志(“2222”);
var arrElement2={
室友:室友,
checkindat:alreadycheckin[i].checkindat,
签出:alreadycheckin[i]。签出
};
tmpAlreadycheckin.push(欠款项2);
}
}否则{
控制台日志(“3333”);
var arrElement2={
室友:室友,
checkindat:alreadycheckin[i].checkindat,
签出:alreadycheckin[i]。签出
};
tmpAlreadycheckin.push(欠款项2);
}
}否则{
控制台日志(“3333”);
var arrElement2={
室友:室友,
checkindat:alreadycheckin[i].checkindat,
签出:alreadycheckin[i]。签出
};
tmpAlreadycheckin.push(欠款项2);
}
}
console.log(tmpAlreadycheckin);
}
});

2017年9月24日
2017年9月25日
2017年9月26日

2017年9月27日
如果您有以下格式的对象数组:
[{checkindat:“24/09/2017”,checkout:“25/09/2017”},{checkindat:“25/09/2017”,checkout:“26/09/2017”}]
:那么您可以首先按checkindate对数组排序,然后向后迭代数组。您可以从最后一个元素开始,查看其
checkindat
,然后将其与上一个元素的
签出进行比较。如果它们相同,请将以前的元素
签出更新为前面的元素,然后删除前面的元素。

谢谢您的建议。是的,我做了,它在两次约会中工作正常,但在三次约会中工作不正常。你能发布一些简单的示例代码给我看吗?做一个JSFIDLE请检查这个。我删除了一些不必要的代码。谢谢。当您创建
tmpalReadyCheckkin
时,您没有首先按签入日期对其进行排序,因此它会根据您单击按钮的顺序而中断。您必须在处理之前进行排序。@pankajagarwal我建议每次单击复选框时为每个复选框重新生成
arElement
对象,而不是将其持久化。我认为这可能是你的问题的原因。
checkindat:"25/09/2017",checkouts:"26/09/2017"
checkindat:"26/09/2017",checkouts:"27/09/2017"