JS - 将字符串数组作为日期排序
Posted
技术标签:
【中文标题】JS - 将字符串数组作为日期排序【英文标题】:JS - Do sort in an array of strings as dates 【发布时间】:2021-10-25 12:25:00 【问题描述】:我有以下数组:
let datas = ["nov/2018", "set/2018", "jan/2019", "dez/2018", "out/2018"]
当我执行时
datas.sort()
他按字母顺序排序,但是,我必须先按年份排序,然后再按字母顺序。
["dez/2018", "jan/2019", "nov/2018", "out/2018", "set/2018"]
今天测试我到了下面这行代码:
var datas = ["mar", "abr", "jan", "dez", "set", "mai", "jun", "out", "jul"];
var datas_corretas = ["jan", "fev", "mar", "abr", "mai", "jun", "jul", "ago", "set", "out", "nov", "dez"];
var result = [];
datas_corretas.forEach(function ordenar(element, index)
var mes = datas.filter(function(valor)
return valor == datas_corretas[index];
);
result.push(mes[0]);
for(element of result)
if (element === undefined || element === null)
result.pop(element);
);
console.log(result);
这样我可以对数据进行排序,但问题是当我将它与年份一起使用时
var datas = ["mar/2018", "abr/2018", "jan/2019", "dez/2018", "set/2018", "mai/2018", "jun/2018", "out/2018", "jul/2018"];
有人知道我该如何解决这个问题吗?
【问题讨论】:
“然后按字母顺序”是什么意思? 那么对于给定的输入,您希望输出是什么确切?你真的想把这些按日期顺序排列吗?如果是这样,那么您需要先比较年份部分,然后再比较月份部分来sort。 请同时添加想要的结果。 【参考方案1】:您可以先拆分日期并按年份排序,然后再按月份索引。
var months = ["jan", "fev", "mar", "abr", "mai", "jun", "jul", "ago", "set", "out", "nov", "dez"],
datas = ["nov/2018", "set/2018", "jan/2019", "dez/2018", "out/2018"];
datas.sort((a, b) =>
var aa = a.split('/'),
bb = b.split('/');
return aa[1] - bb[1] || months.indexOf(aa[0]) - months.indexOf(bb[0]);
);
console.log(datas);
为了更快地访问,您可以将月份存储为对象。
var months = jan: 1, fev: 2, mar: 3, abr: 4, mai: 5, jun: 6, jul:7, ago: 8, set: 9, out: 10, nov: 11, dez: 12 ,
datas = ["nov/2018", "set/2018", "jan/2019", "dez/2018", "out/2018"];
datas.sort((a, b) =>
var aa = a.split('/'),
bb = b.split('/');
return aa[1] - bb[1] || months[aa[0]] - months[bb[0]];
);
console.log(datas);
【讨论】:
【参考方案2】:但是,我必须先按年份排序,然后按字母顺序 顺序。
["dez/2018", "jan/2019", "nov/2018", "out/2018", "set/2018"]
为了达到预期的效果,您可以使用两次.sort()
,.split()
"/"
、.pop()
和.shift()
datas.sort((a, b) => a.split("/").pop() < b.split("/").pop() ? -1 : 0)
.sort((a, b) => a.split("/").shift() < b.split("/").shift() ? -1 : 0);
【讨论】:
【参考方案3】:您可以将自定义比较器传递给 javascript 的 sort
函数。我们可以使用它来编写我们自己的排序逻辑,首先比较年份,然后是月份:
let datas = ["nov/2018", "set/2018", "jan/2019", "dez/2018", "out/2018"]
const orderedMonths = ["jan", "fev", "mar", "abr", "mai", "jun", "jul", "ago", "set", "out", "nov", "dez"];
datas.sort((a,b) =>
var [montha,yeara] = a.split('/');
var [monthb,yearb] = b.split('/');
if (yeara > yearb) return 1;
if (yearb > yeara) return -1;
if (orderedMonths.indexOf(montha) > orderedMonths.indexOf(monthb)) return 1;
if (orderedMonths.indexOf(monthb) > orderedMonths.indexOf(montha)) return -1;
return 0;
);
console.log(datas);
【讨论】:
【参考方案4】:将值转换为数字和索引时非常容易。
下面是我的示例。
var datas_corretas = ["jan", "fev", "mar", "abr", "mai", "jun", "jul", "ago", "set", "out", "nov", "dez"];
var datas = ["mar/2018", "abr/2018", "jan/2019", "dez/2018", "set/2018", "mai/2018", "jun/2018", "out/2018", "jul/2018"];
var result = datas.sort(function(a, b)
// index of the month
var aMonth = datas_corretas.indexOf(a.split("/")[0]);
// convert the year to number
var aYear = parseInt(a.split("/")[1]);
var bMonth = datas_corretas.indexOf(b.split("/")[0])
var bYear = parseInt(b.split("/")[1])
return aYear - bYear || aMonth - bMonth;
);
console.log(result)
【讨论】:
【参考方案5】:我必须先按年份排序,然后按字母顺序。
答案似乎都按时间顺序对月份进行排序,所以这里是按字母顺序对它们进行排序的方法。拆分为月份和年份,然后首先比较年份,然后使用 localeCompare 比较月份。
let datas = ["nov/2018", "set/2018", "jan/2019", "dez/2018", "out/2018"]
datas.sort((a, b) =>
let [amon, ayr] = a.split('/');
let [bmon, byr] = b.split('/');
return (ayr - byr) || amon.localeCompare(bmon);
);
console.log(datas);
【讨论】:
以上是关于JS - 将字符串数组作为日期排序的主要内容,如果未能解决你的问题,请参考以下文章