【问题标题】:Order an array of objects by string date [duplicate]按字符串日期排序对象数组[重复]
【发布时间】:2021-07-05 02:36:01
【问题描述】:

我有一个如此结构化的对象数组。

let array = [
    {date: "22/03/2021 17:57", y: 10, type: "dil"},
    {date: "22/03/2021 17:58", y: 1, type: "dil"},
    {date: "15/04/2021 14:52", y: 3, type: "dil"},
    {date: "24/03/2021 14:52", y: 4, type: "dil"},
    {date: "01/04/2021 14:52", y: -2, type: "spp"},
    {date: "24/03/2021 14:53", y: -5, type: "spp"},
    {date: "18/04/2021 16:28", y: 3, type: "spp}
]

我必须按日期对其进行排序,但我不知道该怎么做,因为日期是一个字符串,如果我使用排序方法

array.sort((a,b) => (a.x > b.x) ? 1 : ((b.x > a.x) ? -1 : 0))

它是根据前两个字符排序的,而不是通过年、月、日、小时和分钟来正确排序。

有什么想法吗?我确信这很容易,但我很困惑。

【问题讨论】:

  • 将日期重新格式化为 ISO-8601 并在比较中使用它。遗憾的是,虽然 javascript 确实在日期上提供了 toISOString 方法,但 it doesn't have a built-in format for european datetimes 只有 RFC 2822 和 ISO8601,并且不提供通用格式字符串,因此您必须手动解析输入(或使用类似 moment.js 的东西) .
  • 看看我的答案,也许它会帮助你:)你可以通过添加简单的库来完成它
  • 如果您使用来自 dupe target 的答案,请使用来自 RobG 的答案。仅针对这一特定情况更改 String 的原型,就像在接受的答案中一样,是矫枉过正...
  • 你的日期字符串没有有效的格式,你需要改变它你可以使用date-fns.org/docs/Getting-Started这个库可以帮助你修复日期格式。因此,在具有固定日期格式之后,您可以像这样进行排序 new Date(date1).valueOf() - new Date(date2).valueOf()
  • @NverAbgaryan “您的日期字符串没有有效的格式” - 什么在该有效日期格式上无效?

标签: javascript arrays sorting


【解决方案1】:

您可以创建一个ISO 8601 日期字符串并按字符串排序。

const
    getISO = string => string.replace(/(..)\/(..)\/(....) (..):(..)/, '$3-$2-$1 $4:$5'),
    array = [{ date: "22/03/2021 17:57", y: 10, type: "dil" }, { date: "22/03/2021 17:58", y: 1, type: "dil" }, { date: "15/04/2021 14:52", y: 3, type: "dil" }, { date: "24/03/2021 14:52", y: 4, type: "dil" }, { date: "01/04/2021 14:52", y: -2, type: "spp" }, { date: "24/03/2021 14:53", y: -5, type: "spp" }, { date: "18/04/2021 16:28", y: 3, type: "spp" }];

array.sort((a, b) => getISO(a.date).localeCompare(getISO(b.date)));

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 你可以先找一个骗子。
【解决方案2】:

您可以使用moment.Js 与公式解析日期看起来像

const parseDate = strDate => moment(strDate, "DD/MM/YYYY HH:mm");

之后,您可以通过排序方法对数组进行排序

array.sort((a, b) => parseDate(a.date) - parseDate(b.date));

完整代码sn-p

let array=[{date:"22/03/2021 17:57",y:10,type:"dil"},{date:"22/03/2021 17:58",y:1,type:"dil"},{date:"15/04/2021 14:52",y:3,type:"dil"},{date:"24/03/2021 14:52",y:4,type:"dil"},{date:"01/04/2021 14:52",y:-2,type:"spp"},{date:"24/03/2021 14:53",y:-5,type:"spp"},{date:"18/04/2021 16:28",y:3,type:"spp"}];

const parseDate = strDate => moment(strDate, "DD/MM/YYYY HH:mm");
array.sort((a, b) => parseDate(a.date) - parseDate(b.date));
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

【讨论】:

  • 这能回答你的问题吗?如果您需要任何帮助,请告诉我^^! @Dwight Danger Schrute
【解决方案3】:

您首先可以通过三种方式执行此操作。如果日期在 DD/MM/YYYY,只需将它们转换为 YYYYMMDD

array.sort(function(date1,date2) {
  date1 = date2.split('/').reverse().join('');
  date1 = date2.split('/').reverse().join('');
  return date1 > date2 ? 1 : date1 < date2 ? -1 : 0;
});

第二种方法可以使用 String.prototype.localeCompare()

array.sort(function(date1, date2) {
 return date1.localeCompare(date2);  
})

第三个很简单,您可以将两者都转换为 Date 对象并进行比较

【讨论】:

    猜你喜欢
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2015-02-25
    • 2021-07-13
    • 1970-01-01
    • 2021-08-19
    • 2018-02-06
    相关资源
    最近更新 更多