我想按升序对数组排序。日期为字符串格式
["09/06/2015", "25/06/2015", "22/06/2015", "25/07/2015", "18/05/2015"]
甚至需要一个函数来检查这些日期是否是连续的形式:
eg - Valid - ["09/06/2015", "10/06/2015", "11/06/2015"]
Invalid - ["09/06/2015", "25/06/2015", "22/06/2015", "25/07/2015"]
示例代码:
function sequentialDates(dates){
var temp_date_array = [];
$.each(dates, function( index, date ) {
//var date_flag = Date.parse(date);
temp_date_array.push(date);
});
console.log(temp_date_array);
var last;
for (var i = 0, l = temp_date_array.length; i < l; i++) {
var cur = new Date();
cur.setTime(temp_date_array[i]);
last = last || cur;
//console.log(last+' '+cur);
if (isNewSequence(cur, last)) {
console.log("Not Sequence");
}
}
//return dates;
}
function isNewSequence(a, b) {
if (a - b > (24 * 60 * 60 * 1000))
return true;
return false;
}
5条答案
按热度按时间ngynwnxp1#
简单解决方案
不需要将字符串转换为日期或使用RegExp。
简单的解决方案是使用Array.sort()方法。sort函数将日期格式设置为YYYYMMDD,然后比较字符串值。假设日期输入格式为DD/MM/YYYY。
更新:
一个有用的评论建议使用
localeCompare()
来简化排序函数。上面的代码片段显示了这种替代方法。运行测试片段
disbfnqx2#
如果要对字符串进行排序,您需要将字符串转换为日期,并比较这些日期。您可以使用
sort
方法接受的参数来实现这一点:为了减少代码冗余,并处理不同的日期格式,您可以添加一个额外的函数来创建
sort
方法所需的比较器:然后,您可以通过向
createSorter
调用传递不同的函数来使用不同的日期格式化程序。至于你的第二个问题,你可以从你的字符串中创建一个(排序的)日期数组,并在这个数组上执行你的逻辑:
你可以遍历
sortedDates
数组,如果你发现两个不连续的日期,那么你的日期之间有间隔。k5ifujac3#
inn6fuwd4#
这是另一个使用es6箭头函数的解决方案;在两行中完成工作。
我在这里看到的投票最多的答案的问题是,当前导零丢失为个位数的天/月时,它会失败。
例如:
var data = ["9/6/2015", "12/6/2015", "22/6/2015", "25/7/2015", "18/5/2015"];
。最可靠的方法是使用日期排序而不是字符串排序。尽管从性能的Angular 来看,将这些字符串强制转换为Date看起来可能是一种开销。
icnyk63a5#
要对日期字符串进行升序排序 * 而不改变其值 *,请尝试以下操作:
结果数组
sortedT
应该是日期字符串的排序数组。注:
您的日期格式存储在
dd/mm/yyyy
中,但JavaScript的标准日期格式是mm/dd/yyyy
。因此,为了在不使用外部日期格式库的情况下将该字符串解析为Date,因此需要在排序期间转换日期字符串以实现兼容性。