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】:

您可以将自定义比较器传递给 javascriptsort 函数。我们可以使用它来编写我们自己的排序逻辑,首先比较年份,然后是月份:

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 - 将字符串数组作为日期排序的主要内容,如果未能解决你的问题,请参考以下文章

【JS】数组对象自定义排序

对字符串日期数组进行排序

按即将到来的日期对日期为字符串的数组进行排序

学习js权威指南第五站 ---- 数组

如何按日期对字典数组进行排序?

JS数组之重排序方法