[英]How does one sort a multi dimensional array by multiple columns in JavaScript?
[英]How to sort javascript array with multiple datetime columns
给出以下数组:
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;
}
}
});
出于某种原因,在按effectiveDate
升序或降序对数据进行排序time
会正确排序time
。 但是当按actualDate
排序数据时,也会按升序或降序排序, time
数据不正确。
任何帮助将不胜感激。
代替
return (moment(b.time) - moment(a.time));
采用:
moment(a.time, "HH:mm") - moment(b.time, "HH:mm")
你需要告诉moment.js输入字符串是“时间”字符串。
三个问题:
===
比较两个moment
s将不起作用; 他们永远不会平等。 Moment提供了一个.isSame
函数来执行此操作。 "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;
}
}
});
}
输出这些电话,
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' } ]
UPDATE
更简单的比较器功能:
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;
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.