3

我正在尝试使用 js 类型的 luxon 时间对象。我不确定这是否如 sort 所期望的那样正确-1,0,1

const results  = objectGroupedByYearMonth[year][month].results.sort(
          (a,b) => 
            DateTime.fromISO(b.created)
              .diff(DateTime.fromISO(a.created))
        )

这将返回一个 dt 对象console.log("DIF: ", DateTime.fromISO("2020-11-03T17:01:22.205041Z") .diff(DateTime.fromISO("2020-11-03T17:15:23.998284Z")))

4

3 回答 3

5

您可能希望对象转换为DateTime数字 Unix 时间戳:

function compareLuxonDates(a: DateTime, b: DateTime) {
  return a.toMillis() - b.toMillis()
}
arrayWithDateObjects.sort(compareLuxonDates)
于 2020-11-16T09:34:04.487 回答
3

根据他们的文档,Luxon 的DateTime类 implements #valueof,它返回对象的原始值——在这种情况下,它是纪元毫秒。这意味着您可以在排序时直接使用<>比较 Luxon DateTime 对象。

这是compareFn我有时用来对 Luxon DateTime 数组进行排序的单线。

快速回答

sortDateTimes = (a, b) => a < b ? -1 : a > b ? 1 : 0;

这种方法有效,因为平等是包罗万象的条件(0最后的)。尽管您可以自由地使用对象,但<不能用于检查是否相等。Luxon 为此提供了一个功能。或者,因为它们实现了 ,您可以使用 使对象转换为它们的原始值。>DateTime===.equals(...)#valueOfDateTime+

const { DateTime } = require('luxon');

a = DateTime.fromISO('2020-01-15');
b = DateTime.fromISO('2020-01-15');

a === b; // false
+a === +b; // true

上面的小compareFn单行代码在对象数组上工作得很好,但是由于我们经常想要对嵌入在属性DateTime中的对象数组进行排序(如),所以我们必须采取稍微不同的方法。DateTimecreated

sortByCreated = (a, b) =>  
  a.created < b.created ? -1 : a.created > b.created ? 1 : 0;

有力的答案

对于奖励积分,使用函数生成器使其更可重用。

createPropertySorter = (propertyName) => (a, b) =>
  a[propertyName] < b[propertyName] ? -1 : a[propertyName] > b[propertyName] ? 1 : 0;

然后,当您需要排序而不是直接使用排序函数本身时,将使用生成器。从OP的例子:

const results = objectGroupedByYearMonth[year][month].results.sort(
    createPropertySorter('created')
  );

// results is now sorted, e.g. results.map(JSON.stringify) is
// [
//  '{"name":"some Object","created":"2020-01-25T00:00:00.000-07:00"}',
//  '{"name":"some Object","created":"2020-01-31T00:00:00.000-07:00"}',
//  '{"name":"some Object","created":"2020-02-01T00:00:00.000-07:00"}',
//  '{"name":"some Object","created":"2020-02-01T00:00:00.000-07:00"}',
//  '{"name":"some Object","created":"2020-02-07T00:00:00.000-07:00"}'
// ]

注意可变性

关于可变性的简短说明:在上面的示例中,objectGroupedByYearMonth[year][month]有一个名为results. 因为就地sort()排序数组,所以排序(不仅仅是返回值)。这可能是 OP 的意图,或者可能无关紧要,但我认为值得考虑。保留原始排序的修订版本将使用扩展运算符对原始数组的副本进行排序。objectGroupedByYearMonth[year][month].results

const results = [...objectGroupedByYearMonth[year][month].results].sort(
    createPropertySorter('created')
  );
// results is sorted, while objectGroupedByYearMonth[year][month].results
// is still in its original order

反向排序

如果要反转排序顺序(最新日期优先),请在排序功能中切换a和。b

createPropertyReverseSorter = (propertyName) => (a, b) =>
  b[propertyName] < a[propertyName] ? -1 : b[propertyName] > a[propertyName] ? 1 : 0;
于 2021-01-15T16:43:09.050 回答
3

您可以直接将字符串与String#localeCompare.

(a, b) => b.created.localeCompare(a.created)
于 2020-11-12T10:22:12.603 回答