【问题标题】:Sort by iso string descending isn't working按iso字符串降序排序不起作用
【发布时间】:2018-09-22 07:03:02
【问题描述】:

期望的行为

按对象的iso_string 属性降序排列对象数组。

实际行为

数组顺序没有改变。

我的尝试

我一定是在某处犯了一个简单的错误,因为多个帖子确认这是正确的sort() 语法。

iso_string 值是用new Date().toISOString() 生成的;

var dates = [{
  "formatted_date": "22/09/2018 @ 04:02pm",
  "iso_string": "2018-09-22T06:02:22.485Z"
}, {
  "formatted_date": "22/09/2018 @ 04:12pm",
  "iso_string": "2018-09-22T06:12:04.471Z"
}, {
  "formatted_date": "22/09/2018 @ 04:05pm",
  "iso_string": "2018-09-22T06:05:45.818Z"
}, {
  "formatted_date": "22/09/2018 @ 04:00pm",
  "iso_string": "2018-09-22T06:00:46.954Z"
}, {
  "formatted_date": "22/09/2018 @ 03:56pm",
  "iso_string": "2018-09-22T05:56:13.968Z"
}];

var sorted_dates = dates.sort(function(a, b) {
  return b.iso_string - a.iso_string;
});

console.log(sorted_dates);

编辑:我将值包装在 new Date() 中并且它排序正确。

【问题讨论】:

  • 你能在 JavaScript 中减去两个字符串吗?这样做的预期结果是什么?

标签: javascript isodate


【解决方案1】:

由于您有ISO 8601 日期可以按字典顺序排序,因此您可以使用string.localCompare() 对其进行排序。

var dates = [{ "formatted_date": "22/09/2018 @ 04:02pm", "iso_string": "2018-09-22T06:02:22.485Z" }, { "formatted_date": "22/09/2018 @ 04:12pm", "iso_string": "2018-09-22T06:12:04.471Z" }, { "formatted_date": "22/09/2018 @ 04:05pm", "iso_string": "2018-09-22T06:05:45.818Z"}, { "formatted_date": "22/09/2018 @ 04:00pm", "iso_string": "2018-09-22T06:00:46.954Z" }, { "formatted_date": "22/09/2018 @ 03:56pm", "iso_string": "2018-09-22T05:56:13.968Z" }],
    sorted_dates = dates.sort((a, b) => b.iso_string.localeCompare(a.iso_string));

console.log(sorted_dates);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:

    iso_string 是字符串类型,需要先转换成日期再排序。这是一个改进的示例

    var dates = [{
      "formatted_date": "22/09/2018 @ 04:02pm",
      "iso_string": "2018-09-22T06:02:22.485Z"
    }, {
      "formatted_date": "22/09/2018 @ 04:12pm",
      "iso_string": "2018-09-22T06:12:04.471Z"
    }, {
      "formatted_date": "22/09/2018 @ 04:05pm",
      "iso_string": "2018-09-22T06:05:45.818Z"
    }, {
      "formatted_date": "22/09/2018 @ 04:00pm",
      "iso_string": "2018-09-22T06:00:46.954Z"
    }, {
      "formatted_date": "22/09/2018 @ 03:56pm",
      "iso_string": "2018-09-22T05:56:13.968Z"
    }];
    var sorted_dates = dates.sort(function(a, b) {
      return new Date(b.iso_string) - new Date(a.iso_string);
    });
    console.log(sorted_dates);

    您也可以使用localCompare() 而不将字符串转换为日期。

    var dates = [{
      "formatted_date": "22/09/2018 @ 04:02pm",
      "iso_string": "2018-09-22T06:02:22.485Z"
    }, {
      "formatted_date": "22/09/2018 @ 04:12pm",
      "iso_string": "2018-09-22T06:12:04.471Z"
    }, {
      "formatted_date": "22/09/2018 @ 04:05pm",
      "iso_string": "2018-09-22T06:05:45.818Z"
    }, {
      "formatted_date": "22/09/2018 @ 04:00pm",
      "iso_string": "2018-09-22T06:00:46.954Z"
    }, {
      "formatted_date": "22/09/2018 @ 03:56pm",
      "iso_string": "2018-09-22T05:56:13.968Z"
    }];
    
    var sorted_dates = dates.sort((a, b)=>b.iso_string.localeCompare(a.iso_string));
    console.log(sorted_dates);

    【讨论】:

    • OP 不需要“转换为日期”,使用 localeCompare 进行字符串比较可以正常工作。
    • @RobG 我不知道该功能,但谢谢我检查并更新了另一个解决方案
    猜你喜欢
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 2011-10-16
    • 2014-05-06
    • 1970-01-01
    相关资源
    最近更新 更多