【问题标题】:sorting array of date objects error javascript排序日期对象数组错误javascript
【发布时间】:2015-09-08 22:33:06
【问题描述】:

我收到一个奇怪的错误,无法弄清楚。我有一组日期对象(AngularJS),我想对它们进行排序。我正在做如下

console.log(tempDates);
tempDates.sort( function(a, b) {
    return a-b;
});
console.log(tempDates);

问题是 tempDates 数组正在被修改,即日期值正在被修改。自定义排序功能错了吗? / 我错过了什么?

原来的 tempDates -

["Jun 19", "Jun 26", "Jul  3", "Jul 10", "Jul 17", "Jul 24", "Jul 31", "Aug  7", "Aug 14", "Aug 21", "Aug 28", "Sep  4", "Sep 11"]

排序后是

["Jun 19", "Jun 26", "Jul  1", "Jul  3", "Jul 10", "Jul 17", "Jul 24", "Aug  7", "Aug 14", "Aug 21", "Aug 28", "Sep  4", "Sep 11"]

(请注意,该数组由 DATE 对象组成,我放置的控制台输出只是为了便于阅读)

日期正在发生变化,例如“7 月 1 日”突然出现,“7 月 31 日”已从列表中删除。发生这种情况的任何原因?

【问题讨论】:

  • @V.J.来自 OP 的引用:“请注意,数组由 DATE 对象组成,我放置的控制台输出只是为了便于阅读”
  • @Sirko:- 运算符将对Date 实例执行valueOf(hint:number),这将获得与getTime 相同的值。减去Date 实例很好。
  • @swordfish12:您的代码可以正常工作(证明:jsfiddle.net/cx9on9ph -- 我已经随机化了初始日期,因此我们可以实际看到排序),并且不会 修改数组中的Date 对象。您看到的行为来自代码中未包含在问题中的其他内容。
  • 我们无法为您提供我们看不到的代码。
  • 您可能会遇到well-known console log confusion - 例如,稍后 正在修改日期,然后您扩展您在之前 记录的内容你看到了变化。下面是一个例子:jsfiddle.net/cx9on9ph/1 您可以使用console.log(JSON.stringify(tempDates)) 验证这一点,因此记录的内容是不会更改的字符串。

标签: javascript arrays angularjs sorting


【解决方案1】:

您正在排序日期对象,而不是数字。要将它们按数字排序,您必须执行以下操作:

console.log(tempDates);
tempDates.sort( function(a, b) {
    return a.getTime() - b.getTime(); 
});
console.log(tempDates);

.getTime() 会将日​​期的字符串表示形式转换为实际数字。 (自 1970/01/01 以来的毫秒数)

【讨论】:

  • 感谢您的输入,但我想通了,由于异步http调用存在问题,另一部分代码正在修改数据。
  • 允许比较日期对象。所以 (a.getTime() - b.getTime()) 将与 (a-b) 相同
猜你喜欢
  • 1970-01-01
  • 2021-06-01
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
相关资源
最近更新 更多