【问题标题】:JS - Do sort in an array of strings as datesJS - 将字符串数组作为日期排序
【发布时间】: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
  • 请同时添加想要的结果。

标签: javascript arrays sorting date


【解决方案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);

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-06-03
            • 1970-01-01
            • 2020-04-13
            • 2015-08-21
            • 2011-06-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多