对字符串日期值排序数组不返回正确的结果顺序(降序)

问题描述 投票:0回答:5

我正在尝试在字符串日期对数组进行排序,并且我遇到了一些问题。

我的数组被称为:myArray并具有以下示例信息:

0: {…}
​​
deployed_date: "29/01/2019 14:08:44"
​​last_restored_date: "11/01/2019 11:22:22"

1: {…}
​​
deployed_date: "29/01/2019 14:08:19"
​​
2: {…}
​​
​​deployed_date: "29/01/2019 11:34:23"
​​
3: {…}
​​
deployed_date: "11/02/2019 11:24:33"
​​
4: {…}
​​
deployed_date: "11/02/2019 11:24:24"
​​last_restored_date: "11/01/2019 11:25:42"

我已经使用了Lodash和本机JavaScript排序,但遗憾的是我无法按降序排序这个deployed_date。

仅供参考,我也在使用momentjs:

myArray[key].deployed_date = moment(value.deployed_date,'YYYYMMDDHHmmss').format('DD/MM/YYYY HH:mm:ss');

我用过:

Kakssupoi //洛兹

以及

_.orderBy(myArray, ['deployed_date'],['desc'])

订单显示在上面的数组中。

我不确定这是否与数组索引1,2和3没有myArray.sort() 值这一事实有关,但由于某种原因,数组未被deployed_date desc正确排序。

我期望的结果是:

last_restored_date

如何实现此处显示的预期结果顺序?

javascript arrays lodash
5个回答
1
投票

请使用时刻库​​首先以'DD / MM / YYYY HH:mm:ss'格式化日期,下面的代码将排序并返回结果,因为您正在寻找11/02/2019 11:24:33 11/02/2019 11:24:24 29/01/2019 14:08:44 29/01/2019 14:08:19 29/01/2019 11:34:23


0
投票

一种解决方案是使用 x.sort((a,b)=>{ return moment(a,'DD/MM/YYY HH:mm:ss').isAfter(moment(b,'DD/MM/YYY HH:mm:ss')) ? -1 : 1 })比较两个对象的deployed_date时将日期映射到标准格式:


0
投票

const myArray = [
  {deployed_date: "29/01/2019 14:08:44", last_restored_date: "11/01/2019 11:22:22"},
  {deployed_date: "29/01/2019 14:08:19"},
  {deployed_date: "29/01/2019 11:34:23"},
  {deployed_date: "11/02/2019 11:24:33"},
  {deployed_date: "11/02/2019 11:24:24", last_restored_date: "11/01/2019 11:25:42"}
];

myArray.sort((a, b) =>
{
    let [aDate, aHour] = a.deployed_date.split(" ");
    let [bDate, bHour] = b.deployed_date.split(" ");
    let [aDay, aMonth, aYear] = aDate.split("/");
    let [bDay, bMonth, bYear] = bDate.split("/");
    let newADate = `${aYear}/${aMonth}/${aDay} ${aHour}`;
    let newBDate = `${bYear}/${bMonth}/${bDay} ${bHour}`;
    
    return newBDate.localeCompare(newADate);
});

console.log(myArray);

Explanation

  1. 将每个日期转换为ISO字符串日期(标准格式)
  2. 从该字符串中提取一个数字(使用const toDate = str => { const [d, t] = str.split(' ') return new Date(`${d.split('/').reverse().join('-')}T${t}Z`).getTime(); }; const compareByDate = (x, y) => toDate(y.deployed_date) - toDate(x.deployed_date); const arr = [ {deployed_date: "29/01/2019 14:08:44"}, {deployed_date: "29/01/2019 14:08:19"}, {deployed_date: "29/01/2019 11:34:23"}, {deployed_date: "11/02/2019 11:24:33"}, {deployed_date: "11/02/2019 11:24:24"} ]; arr.sort(compareByDate); console.log(arr);)以便于比较。使用Date.getTime()构造函数将字符串更改为Date。然后将该日期转换为毫秒
  3. 由于您需要递减顺序(反转),请确保在比较器功能中反转操作数。 Date
  4. 一旦你有数字作为日期,你可以使用(x, y) => y - x;基于关键Array.sort

Note

我们想要使用的ISO格式是deployed_date。由于我们有YYYY-MM-DDTHH:MM:SSZ,我们需要做一些处理。

  1. 29/01/2019 14:08:44拆分字符串以分隔时间和日期
  2. 由于拆分返回2个项目的数组,您可以使用' '操作。
  3. array destructuring拆分日期并反转数组,因为我们需要'/'。然后YYYY-MM_DD使用join字符
  4. 使用'-'创建日期,然后使用new Date(...)将其转换为毫秒

0
投票

您可以在结果数组上使用map来获得预期结果

Date.getMilliseconds()

希望它有意义


0
投票

我看到它的方式,你对lodash的orderBy的使用是好的,它应该按预期订购你的数据。造成问题的原因是你排序字符串而不是日期,你的字符串格式为DD / MM / YYYY,如果你想对它们进行排序,这是不理想的:01/01/2019是«之前的»31/12/2018 (虽然荒谬)。

您可以做什么:1 /您可以使用日期或时刻数据而不是字符串2 /或将日期格式化为YYYY-MM-DD ...等等3或将函数传递给排序函数'_.orderBy(myArray, [d =>时刻(d.deployed_data,...)],['desc'])`

热门问题
推荐问题
最新问题