如何按照“moment”日期值对对象数组进行排序?

4

这个数组由像这样的对象组成

[
  {
    name: 'john',
    date: '21-07-2020',
    car: 'bmw'
  },
  {
    name: 'fred',
    date: '14-10-2020',
    car: 'tesla'
  }
]

我正在尝试使用Moment库的isBefore函数将其按升序排序,但它并没有起作用:

array.sort((a, b) => moment(a.date, 'DD-MM-YYYY').isBefore(moment(b.date, 'DD-MM-YYYY')))

1
你的排序逻辑是错误的。对于一个布尔函数在排序中起作用,false 值必须意味着 a 在 b 之前,而 true 则意味着 b 在 a 之前。在这里,你返回 true 如果 a 在 b 之前。 - James
5个回答

6
使用 Moment.js 的 diff 方法。
array.sort((a, b) => moment(a.date, 'DD-MM-YYYY').diff(moment(b.date, 'DD-MM-YYYY')))

4
问题在于isBefore()返回布尔值,而排序回调函数期望数字,因此您需要将该值映射为数字。
// ascending
array.sort((a, b) =>
    moment(a.date, 'DD-MM-YYYY').isBefore(moment(b.date, 'DD-MM-YYYY')) ? -1 : 1,
)

// descending
array.sort((a, b) =>
    moment(a.date, 'DD-MM-YYYY').isBefore(moment(b.date, 'DD-MM-YYYY')) ? 1 : -1,
)


另外,您可以使用Date.parse()而无需使用moment。

const getMS = date => {
  const d = date[0] + date[1];
  const m = date[3] + date[4];
  const y = date[6] + date[7] + date[8] + date[9];
  return Date.parse(`${y}-${m}-${d}`);
};


const arr = [
  {
    name: 'john',
    date: '21-07-2020',
    car: 'bmw',
  },
  {
    name: 'fred',
    date: '14-10-2020',
    car: 'tesla',
  },
];

// ascending
const sortedArr = arr.sort((a, b) => getMS(a.date) - getMS(b.date));

// descending
// const sortedArr = arr.sort((a, b) => getMS(b.date) - getMS(a.date));

console.log(sortedArr)

2
你可以简单地做减法,然后使用Array#sort
const dateArray = ['14-10-2020', '21-07-2020']
dateArray.sort((a,b) => new Moment(a).format('DD-MM-YYYY') - new Moment(b).format('DD-MM-YYYY'))
console.log(mySortedArray)

1
这样做的另一个好处是它类似于大多数其他开发人员编写的比较函数,因此其他开发人员可以轻松理解它 (a, b) => b - a - V Maharajh

2
使用 "moment" 进行排序
function sortDate(dateA, dateB, direction = 'asc') {
    const formats = ['DD-MM-YYYY']; // can be several
    return (moment(dateA, formats).isBefore(moment(dateB, formats)) ? -1
        : moment(dateA, formats).isAfter(moment(dateB, formats)) ? 1 : 0) * (direction === 'asc' ? 1 : -1)
}

例子:

const array = [
    {
        name: 'john',
        date: '21-07-2020',
        car: 'bmw'
    },
    {
        name: 'fred',
        date: '14-10-2020',
        car: 'tesla'
    },
    {
        name: 'bed',
        date: '15-10-2020',
        car: 'ferrari'
    },
    {
        name: 'j',
        date: '12-10-2020',
        car: 'rolls royce'
    }
];

array.sort((a, b) => sortDate(a.date, b.date)); // sort ascending
array.sort((a, b) => sortDate(a.date, b.date, 'desc')); // sort descending

0

没有必要将字符串转换为 Moment 来排序。

arr.sort(({date:date1},{date:date2})=>
      date1.split("-").reverse().join('')
        .localeCompare(
              date2.split("-").reverse().join('')));

const arr = [
  {
    name: 'john',
    date: '21-07-2020',
    car: 'bmw'
  },
  {
    name: 'fred',
    date: '14-10-2020',
    car: 'tesla'
  }
];
arr.sort(({date:date1},{date:date2})=>date1.split("-").reverse().join('').localeCompare(date2.split("-").reverse().join('')));
console.log(arr);


这并没有回答问题,他正在使用 Moment。 - Sir Mishaa
@Misha,它确实回答了问题,因为它解决了问题。 - Unmitigated
使用split、reverse和join方法处理日期并不是一个好的方式。这有点过于“复杂”了,不太符合它应该做的事情 ;) - Sir Mishaa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接