如何使用多个datetime列对javascript数组进行排序
给定以下数组:如何使用多个datetime列对javascript数组进行排序,javascript,Javascript,给定以下数组: var effectiveDates= [ { actualDate: "2017-08-29", effectiveDate: "2017-01-01", time: "13:22" }, { actualDate: "2017-08-29", effectiveDate: "2017-01-01", time: "11:33" }, {
var effectiveDates= [
{
actualDate: "2017-08-29",
effectiveDate: "2017-01-01",
time: "13:22"
},
{
actualDate: "2017-08-29",
effectiveDate: "2017-01-01",
time: "11:33"
},
{
actualDate: "2017-08-29",
effectiveDate: "2017-01-01",
time: "10:57"
},
{
actualDate: "2016-06-17",
effectiveDate: "2016-01-01",
time: "10:26"
},
{
actualDate: "2016-06-17",
effectiveDate: "2016-01-01",
time: "10:03"
},
{
actualDate: "2015-12-03",
effectiveDate: "2015-01-01",
time: "16:54"
},
{
actualDate: "2014-07-07",
effectiveDate: "2014-05-01",
time: "10:47"
},
{
actualDate: "2014-07-07",
effectiveDate: "2014-05-01",
time: "10:41"
},
{
actualDate: "2014-07-07",
effectiveDate: "2014-01-01",
time: "10:36"
},
{
actualDate: "2014-07-07",
effectiveDate: "2014-01-01",
time: "10:36"
}
]
我试图根据actualDate
或effectiveDate
降序(或根据顺序升序)然后按时间(也根据所需顺序升序或降序)对数据进行排序。我遇到的问题是日期顺序正确,但time
属性顺序不正确。我正在使用moment.js进行日期和时间解析
这就是我迄今为止所做的尝试:
var desc = true; //false;
effectiveDates.sort(function (a, b) {
if (desc) {
if (moment(a.actualDate) === moment(b.actualDate)) {
return (moment(b.time) - moment(a.time));
} else if (moment(a.actualDate) < moment(b.actualDate)) {
return 1;
} else if (moment(a.actualDate) > moment(b.actualDate)) {
return -1;
}
}
else {
if (moment(a.actualDate) === moment(b.actualDate)) {
return (moment(b.time) - moment(a.time));
} else if (moment(a.actualDate) > moment(b.actualDate)) {
return 1;
} else if (moment(a.actualDate) < moment(b.actualDate)) {
return -1;
}
}
});
var desc=true//虚假的;
effectiveDates.sort(函数(a,b){
如果(描述){
if(力矩(a.实际值)==力矩(b.实际值)){
返回(时刻(b.time)-时刻(a.time));
}否则如果(力矩(a.实际值)<力矩(b.实际值)){
返回1;
}否则,如果(力矩(a.实际值)>力矩(b.实际值)){
返回-1;
}
}
否则{
if(力矩(a.实际值)==力矩(b.实际值)){
返回(时刻(b.time)-时刻(a.time));
}否则,如果(力矩(a.实际值)>力矩(b.实际值)){
返回1;
}否则如果(力矩(a.实际值)<力矩(b.实际值)){
返回-1;
}
}
});
出于某种原因,当按effectiveDate
升序或降序对数据排序时,时间的排序是正确的。
但是当按实际日期
对数据进行排序时,同时按升序或降序排序时,时间
数据不正确
任何帮助都将不胜感激。代替
return (moment(b.time) - moment(a.time));
使用:
您需要告诉矩量.js输入字符串是“时间”字符串。三个问题:
使用==
来比较两个时刻将不起作用;他们永远不会平等。矩提供了一个.isname
函数来执行此操作
要解析时间,您需要提供一个格式字符串,在本例中为“HH:mm”
两次减法需要在升序和降序之间反向进行。把订单翻过来就行了
请参阅下面的工作版本,并附上说明更改的注释:
function sorted(desc) {
return effectiveDates.sort(function (a, b) {
if (desc) {
// Use .isSame to compare two moments:
if (moment(a.actualDate).isSame(moment(b.actualDate))) {
// Provide a format to moment so it knows how to parse the times:
return moment(b.time, "HH:mm") - moment(a.time, "HH:mm");
} else if (moment(a.actualDate) < moment(b.actualDate)) {
return 1;
} else if (moment(a.actualDate) > moment(b.actualDate)) {
return -1;
}
}
else {
if (moment(a.actualDate).isSame(moment(b.actualDate))) {
// Reverse the order of the subtraction when sorting ascending:
return moment(a.time, "HH:mm") - moment(b.time, "HH:mm");
} else if (moment(a.actualDate) > moment(b.actualDate)) {
return 1;
} else if (moment(a.actualDate) < moment(b.actualDate)) {
return -1;
}
}
});
}
是:
更新
更简单的比较器功能:
function sorted(desc) {
return effectiveDates.sort(function (a, b) {
// Combine the date and time and parse them together.
var ret = moment(a.actualDate + " " + a.time) - moment(b.actualDate + " " + b.time);
// Flip the sign if we're sorting descending.
if (desc) {
ret *= -1;
}
return ret;
});
}
与其调用moment(a.actualDate)
大量时间,不如将它们存储在一个变量中:aDate=moment(a.actualDate)
等。在这两种情况下,您的时间比较是在同一个方向上进行的。也不需要为else。。。。您可以只设置一组,然后根据描述翻转-1或1。
console.log("DESCENDING:");
console.log(sorted(true));
console.log("ASCENDING:");
console.log(sorted(false));
DESCENDING:
[ { actualDate: '2017-08-29',
effectiveDate: '2017-01-01',
time: '13:22' },
{ actualDate: '2017-08-29',
effectiveDate: '2017-01-01',
time: '11:33' },
{ actualDate: '2017-08-29',
effectiveDate: '2017-01-01',
time: '10:57' },
{ actualDate: '2016-06-17',
effectiveDate: '2016-01-01',
time: '10:26' },
{ actualDate: '2016-06-17',
effectiveDate: '2016-01-01',
time: '10:03' },
{ actualDate: '2015-12-03',
effectiveDate: '2015-01-01',
time: '16:54' },
{ actualDate: '2014-07-07',
effectiveDate: '2014-05-01',
time: '10:47' },
{ actualDate: '2014-07-07',
effectiveDate: '2014-05-01',
time: '10:41' },
{ actualDate: '2014-07-07',
effectiveDate: '2014-01-01',
time: '10:36' },
{ actualDate: '2014-07-07',
effectiveDate: '2014-01-01',
time: '10:36' } ]
ASCENDING:
[ { actualDate: '2014-07-07',
effectiveDate: '2014-01-01',
time: '10:36' },
{ actualDate: '2014-07-07',
effectiveDate: '2014-01-01',
time: '10:36' },
{ actualDate: '2014-07-07',
effectiveDate: '2014-05-01',
time: '10:41' },
{ actualDate: '2014-07-07',
effectiveDate: '2014-05-01',
time: '10:47' },
{ actualDate: '2015-12-03',
effectiveDate: '2015-01-01',
time: '16:54' },
{ actualDate: '2016-06-17',
effectiveDate: '2016-01-01',
time: '10:03' },
{ actualDate: '2016-06-17',
effectiveDate: '2016-01-01',
time: '10:26' },
{ actualDate: '2017-08-29',
effectiveDate: '2017-01-01',
time: '10:57' },
{ actualDate: '2017-08-29',
effectiveDate: '2017-01-01',
time: '11:33' },
{ actualDate: '2017-08-29',
effectiveDate: '2017-01-01',
time: '13:22' } ]
function sorted(desc) {
return effectiveDates.sort(function (a, b) {
// Combine the date and time and parse them together.
var ret = moment(a.actualDate + " " + a.time) - moment(b.actualDate + " " + b.time);
// Flip the sign if we're sorting descending.
if (desc) {
ret *= -1;
}
return ret;
});
}