根据他们的文档,Luxon 的DateTime
类 implements #valueof
,它返回对象的原始值——在这种情况下,它是纪元毫秒。这意味着您可以在排序时直接使用<
或>
比较 Luxon DateTime 对象。
这是compareFn
我有时用来对 Luxon DateTime 数组进行排序的单线。
快速回答
sortDateTimes = (a, b) => a < b ? -1 : a > b ? 1 : 0;
这种方法有效,因为平等是包罗万象的条件(0
最后的)。尽管您可以自由地使用对象,但<
不能仅用于检查是否相等。Luxon 为此提供了一个功能。或者,因为它们实现了 ,您可以使用 使对象转换为它们的原始值。>
DateTime
===
.equals(...)
#valueOf
DateTime
+
const { DateTime } = require('luxon');
a = DateTime.fromISO('2020-01-15');
b = DateTime.fromISO('2020-01-15');
a === b; // false
+a === +b; // true
上面的小compareFn
单行代码在对象数组上工作得很好,但是由于我们经常想要对嵌入在属性DateTime
中的对象数组进行排序(如),所以我们必须采取稍微不同的方法。DateTime
created
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;