不可靠的momentjs数组排序

时间:2018-04-15 01:28:56

标签: node.js sorting momentjs

我有一个对象数组,每个对象都包含一个momentjs对象的日期戳,我觉得这个对象的排序很简单。出于某种原因,它返回了不准确的排序:

const sortedArray = [...merged].sort((a, b) => (a.txDate.isAfter(b.txDate)));

我得到的是:

[ { txDate: moment("2018-02-14T00:00:00.000"), id: 45 },
  { txDate: moment("2017-12-31T00:00:00.000"), id: 0 },
  { txDate: moment("2018-02-15T00:00:00.000"), id: 46 },
  { txDate: moment("2018-01-02T00:00:00.000"), id: 2 },
  { txDate: moment("2018-01-01T00:00:00.000"), id: 1 },
  { txDate: moment("2018-02-17T00:00:00.000"), id: 48 },
  ...
]

显然,txDate并没有按时间顺序排序。

我尝试通过采用一些错误排序的对象并在较小的样本量上尝试相同的算法来隔离问题:

const mergedSample = [merged[0], merged[45], merged[46], merged[51], merged[52], merged[58], merged[49], merged[40], merged[80], merged[37]]
const sortedArraySample = [...mergedSample].sort((a, b) => (a.txDate.isAfter(b.txDate)));

由于某种原因,这是有效的。

[ { txDate: moment("2017-12-31T00:00:00.000"), id: 0 },
  { txDate: moment("2018-02-06T00:00:00.000"), id: 37 },
  { txDate: moment("2018-02-09T00:00:00.000"), id: 40 },
  { txDate: moment("2018-02-14T00:00:00.000"), id: 45 },
  { txDate: moment("2018-02-15T00:00:00.000"), id: 46 },
  { txDate: moment("2018-02-18T00:00:00.000"), id: 49 },
  { txDate: moment("2018-02-20T00:00:00.000"), id: 51 },
  { txDate: moment("2018-02-21T00:00:00.000"), id: 52 },
  { txDate: moment("2018-02-27T00:00:00.000"), id: 58 },
  { txDate: moment("2018-03-21T00:00:00.000"), id: 80 } ]

我想也许这是一个内存问题,并且排序在较大的负载下表现得很奇怪,但是完整的'合并'数组只有长度~90,所以我觉得可以安全地假设情况并非如此。用这个辛苦工作了几个小时后,我猜对了。想法?

1 个答案:

答案 0 :(得分:0)

Array.prototype.sort接受一个函数,该函数根据比较返回一个整数(0,< 0,> 0)。 Moment.isAfter返回一个布尔值,因此您的排序函数在您的测试用例中偶然发挥作用,并且可能因浏览器实现而异。

时刻可以使用+/-运算符,你的排序函数可以是:

const sortedArray = [...merged].sort((a, b) => a.txDate - b.txDate);

看看Sorting in JavaScript: Shouldn't returning a boolean be enough for a comparison function? 详细解释。