【问题标题】:How to sort date array in javascript如何在javascript中对日期数组进行排序
【发布时间】:2023-03-04 20:14:01
【问题描述】:

我有以下日期数组,我想按加入顺序对其进行排序。我试过了,但没有得到肯定的结果。

var arr = [ [ '02/13/2015', 0.096 ],
  [ '11/15/2013', 0.189 ],
  [ '05/15/2014', 0.11 ],
  [ '12/13/2013', 0.1285 ],
  [ '01/15/2013', 0.12 ],
  [ '01/15/2014', 0.11 ],
  [ '02/14/2014', 0.11 ],
  [ '03/14/2014', 0.11 ],
  [ '01/15/2015', 0.096 ],
  [ '07/15/2015', 0.096 ],
  [ '04/15/2013', 0.12 ],
  [ '04/15/2014', 0.11 ],
  [ '05/15/2013', 0.12 ],
  [ '06/14/2013', 0.12 ],
  [ '06/16/2014', 0.11 ],
  [ '07/15/2013', 0.12 ],
  [ '07/15/2014', 0.11 ],
  [ '03/16/2015', 0.096 ]]

我的代码

arr.sort(function(a,b){
  return new Date(a[0][0]) - new Date(b[0][0]);
});

【问题讨论】:

  • 对于初学者来说,a 是一个类似[ '11/15/2013', 0.189 ] 的数组,所以a[0][0] 将导致'1'.. 这仍然需要工作,但是因为new Date(a[0]) - 例如new Date('11/15/2013') - 是定义不明确的行为。我推荐Moment.js 来处理这种情况,但也可以手动解析日期并使用new Date(y, m, d):在询问如何将字符串转换为日期时,不乏此类示例
  • 关于如何“正确地”创建一个日期,参见stackoverflow.com/questions/5619202/…stackoverflow.com/questions/22184747/…

标签: javascript arrays sorting


【解决方案1】:

深受 MDN Sorting with map 的启发。这对于更大的数据集很重要。

var arr = [
    ['02/13/2015', 0.096],
    ['11/15/2013', 0.189],
    ['05/15/2014', 0.11],
    ['12/13/2013', 0.1285],
    ['01/15/2013', 0.12],
    ['01/15/2014', 0.11],
    ['02/14/2014', 0.11],
    ['03/14/2014', 0.11],
    ['01/15/2015', 0.096],
    ['07/15/2015', 0.096],
    ['04/15/2013', 0.12],
    ['04/15/2014', 0.11],
    ['05/15/2013', 0.12],
    ['06/14/2013', 0.12],
    ['06/16/2014', 0.11],
    ['07/15/2013', 0.12],
    ['07/15/2014', 0.11],
    ['03/16/2015', 0.096]
];

// temporary array holds objects with position and sort-value
var mapped = arr.map(function (el, i) {
    var d = el[0].split('/');
    return { index: i, value: new Date(d[2], d[0] - 1, d[1]) };
})

// sorting the mapped array containing the reduced values
mapped.sort(function (a, b) {
    return +(a.value > b.value) || +(a.value === b.value) - 1;
});

// container for the resulting order
var result = mapped.map(function (el) {
    return arr[el.index];
});

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

【讨论】:

  • 出于历史目的,月份应为 0..11
【解决方案2】:

如果你想要的只是按日期排序,我认为这段代码会有所帮助:

arr.sort(function(a,b){return new Date(a[0]) - new Date(b[0]);});

【讨论】:

    【解决方案3】:

    您正在获取日期字符串中的第一个字符,将它们转换为 Date 实例并使用它们进行比较。

    但是,您实际上应该按原样使用 Date 字符串,将它们转换为 Date 实例并进行比较。

    arr.sort(function (a, b) {
      return new Date(a[0]) - new Date(b[0]);
    });
    

    输出

    [ [ '01/15/2013', 0.12 ],
      [ '04/15/2013', 0.12 ],
      [ '05/15/2013', 0.12 ],
      [ '06/14/2013', 0.12 ],
      [ '07/15/2013', 0.12 ],
      [ '11/15/2013', 0.189 ],
      [ '12/13/2013', 0.1285 ],
      [ '01/15/2014', 0.11 ],
      [ '02/14/2014', 0.11 ],
      [ '03/14/2014', 0.11 ],
      [ '04/15/2014', 0.11 ],
      [ '05/15/2014', 0.11 ],
      [ '06/16/2014', 0.11 ],
      [ '07/15/2014', 0.11 ],
      [ '01/15/2015', 0.096 ],
      [ '02/13/2015', 0.096 ],
      [ '03/16/2015', 0.096 ],
      [ '07/15/2015', 0.096 ] ]
    

    【讨论】:

    • FWIW,请参阅我对主帖的评论。将特定于语言环境的字符串传递给 Date 构造函数定义不明确的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2010-10-10
    • 2014-07-08
    • 1970-01-01
    相关资源
    最近更新 更多