我尝试过使用underscorejs,min
和max
方法,但它们无法处理字符串。无论如何,从我读过和学到的东西,因为我从两者都得到了infinite
。
我的数组看起来像是:dateData = ["26/06/2016", "04/06/2016", "13/05/2016", "20/07/2016"]
我怎样才能抓住这些中的最后一个和第一个日期?
我尝试使用sort
看起来像:_.chain(dateData).sort().first().value()
但是我回到了数组中的最后一项而不是数组中的最后一个日期。
答案 0 :(得分:7)
var dateData = ["26/06/2016", "04/06/2016", "13/05/2016", "20/07/2016"];
function dateToNum(d) {
// Convert date "26/06/2016" to 20160626
d = d.split("/"); return Number(d[2]+d[1]+d[0]);
}
dateData.sort(function(a,b){
return dateToNum(a) - dateToNum(b);
});
console.log( dateData );
检索第一个,最后一个日期:
var firstDate = dateData[0];
var lastDate = dateData[dateData.length -1];
基本上,如果您首先将所有26/06/2016
转换为日期数字,例如20160626
,则可以.sort()
代替这些数字。
所以你基本上是排序:
20140626
20140604
20140513
20140720
导致:
[
"13/05/2016",
"04/06/2016",
"26/06/2016",
"20/07/2016"
]
答案 1 :(得分:1)
如果我们可以使用特定格式格式化dateStrings,那么将它们排序为字符串也会将它们排序为日期,例如YYYY-MM-DD。
您可以使用localeCompare来比较字符串。您可以使用以下代码对日期进行排序:
dateData = ["26/06/2016", "04/06/2016", "13/05/2016", "20/07/2016"]
dateData.sort(function(a, b){
var A = a.split("/");
var B = b.split("/");
var strA = [ A[2], A[1], A[0] ].join("/");
var strB = [ B[2], B[1], B[0] ].join("/");
return strA.localeCompare( strB );
});
console.log( dateData );

排序后,您可以将最短和最长日期设为:
var minDate = dateData[0];
var maxDate = dateData[ dateData.length - 1 ];
答案 2 :(得分:0)
为了更容易进行子请求操作,请将格式更改为:YYYY / MM / DD。 这样定期排序可以正确地获得最小值和最大值,并且您不需要进一步解析。 帮助函数排序将是这样的:
for(var i=0;i<dateData.length;++i)
{
var split = dateData[i].split("/");
dateData[i] = split.reverse().join("/");
}
答案 3 :(得分:0)
getTime()方法返回对应的数值 根据世界时间指定日期的时间。 Date.getTime()
dateData = ["26/06/2016", "04/06/2016", "13/05/2016", "20/07/2016"]
.map(a=>a.split('/').reverse().join('/'))
.sort((a,b)=>new Date(a).getTime() - new Date(b).getTime());
console.log(dateData);
答案 4 :(得分:0)
我知道这样做的一种方法是使用.sort()函数作为字符串。 https://msdn.microsoft.com/en-us/library/4b4fbfhk(v=vs.94).aspx
您必须将阵列更改为YYYY-MM-DD
然后您可以拥有以下代码
var dateData = ["2016/06/26", "2016/06/04", "2016/05/13", "2016/07/20"];
dateData.sort();
var first = dateData[0];
var last = dateData[dateData.length-1];
其中first是最早的日期,last是最晚的日期
答案 5 :(得分:0)
很多人已经谈过这个问题,但您需要将日期字符串转换为可在sort函数中进行比较的内容。我没见过的一件事就是如何获得第一个和最后一个日期。这应该可以解决问题:
//original date array
var dateData = ["04/06/2016", "13/05/2016", "20/07/2016","26/06/2016"];
//map through the original array and convert the dates to js date objects
var formattedDates = dateData.map(function(date){
var splitDate = date.split("/")
return new Date(splitDate[2],splitDate[1]-1,splitDate[0])
})
//sort the dates
formattedDates.sort(function(a,b){
// Turn your strings into dates, and then subtract them
// to get a value that is either negative, positive, or zero.
return new Date(a) - new Date(b);
});
//Now you can get the first and last dates:
var firstDate = formattedDates[0]
var lastDate = formattedDates[formattedDates.length-1];
//log to check:
console.log('first date: ', firstDate)
console.log('last date: ', lastDate)
答案 6 :(得分:0)
您可以使用Array#reduce
,因为您只需要两个值,这可以通过一个循环来实现。
var dates = ["26/06/2016", "04/06/2016", "13/05/2016", "20/07/2016"],
values = dates.reduce(function (r, a, i) {
function getISO(s) { return s.replace(/(.+)\/(.+)\/(.+)/, '$3$2$1'); }
if (!i) {
return { min: a, max: a };
}
if (getISO(a) < getISO(r.min)) {
r.min = a;
}
if (getISO(a) > getISO(r.max)) {
r.max = a;
}
return r;
}, {});
console.log(values);
&#13;
答案 7 :(得分:0)
Roko 的回答对我有用,+1。何塞和我也有类似的想法,+1...
...有一种更简单、更可靠的方法:.valueOf()
将日期字符串转换为数字:
const dateAsNumber = new Date(dateAsString).valueOf()
JS 有一个内置的方法/函数,用于计算从一个日期开始经过的毫秒数;那是 .valueOf(),它可以在 Date 对象上调用。因此,将您的日期字符串转换为 Date 对象(以“new Date()”为参数,以日期字符串为参数),然后转换为毫秒。
之后,正常的 .sort() 工作正常。如下图,为了您的方便:
const arrayOfDateStrings = ["5/01/2012", "10/01/2020", "10/01/2019", "11/30/2016", "10/01/2021", "02/01/2020"];
const sortedArray = arrayOfDateStrings.sort((a,b)=>new Date(a).valueOf() - new Date(b).valueOf());
console.log(sortedArray);
或者 Moment.js 可以用来代替内置的 Date 对象/函数,它们以非常相似的方式工作。