首页 > 解决方案 > 按日期排序,空值无效 JSON 对象。

问题描述

抱歉,我是 javascript 新手,但我目前正在尝试根据属性对我的 JSON 对象进行排序,但现在它没有排序。

例如:我尝试这样做:

function sortByKey(array, key)
{

  return array.sort(function(a, b) {
  let x = a[key];
  let y = b[key];
  x = new Date(a.dateModified);
  y = new Date(b.dateModified);
  return x>y ? -1 : x<y ? 1 : 0;
});
}

我尝试根据 "lastCompletedEvaldate" 进行排序:

[
  {
    "_id": "<a MongoDB object ID>",
    "name": "Fred Flintstone",
    "email": "fflintstone@hotmail.com",
    "sex": "male",
    "tags": [
      "foo",
      "bar"
    ],
    "lastCompletedEvalDate": "2018-05-14 12:02:14.955",
    "pendingEvalSentDate": null,
    "pendingEvalViewedEmailDate": null,
    "pendingEvalClickedLinkDate": null

  },
  {
    "_id": "<a MongoDB object ID>",
    "name": "Barney Rubble",
    "email": "barney@gmail.com",
    "sex": "intersex",
    "tags": [],
    "lastCompletedEvalDate": "2018-05-14 12:02:14.954",
    "pendingEvalSentDate": "2018-05-14 12:02:14.955",
    "pendingEvalViewedEmailDate": "2018-05-14 12:02:14.955",
    "pendingEvalClickedLinkDate": "2018-05-14 12:02:14.955"

  },
  {
    "_id": "<a MongoDB object ID>",
    "name": "Bambam Rubble",
    "email": "bam@bam.com",
    "sex": null,
    "tags": [
      "baz"
    ],
    "lastCompletedEvalDate": "2018-05-14 12:02:14.955",
    "pendingEvalSentDate": null,
    "pendingEvalViewedEmailDate": null,
    "pendingEvalClickedLinkDate": null
  }
]

但是,当我像这样使用该功能时:

let temp = sortByKey(file, 'lastCompletedEvalDate');

并使用 get 请求输出:

router.get('/dash/participant', function(req, res){
  res.send(temp);
});

我仍然得到未排序的相同输出。难道我做错了什么。

标签: javascriptjsonsorting

解决方案


如果有任何可行的替代方案,您应该始终避免使用内置的 Date 解析器(请参阅为什么 Date.parse 给出不正确的结果?)。在这种情况下,字符串“2018-05-14 12:02:14.955”与 ECMA-262 中的格式不一致,因此实现可能会返回无效的日期(Safari 也会这样做)。

由于日期字符串将作为字符串排序,因此请使用localeCompare而不是创建 Date 对象:

function sortByKey(array, key) {
  return array.sort((a,b) => a[key].localeCompare(b[key]));
}

var data = [{
    "lastCompletedEvalDate": "2018-05-14 12:02:14.955",
    "pendingEvalSentDate": null,
  },
  {
    "lastCompletedEvalDate": "2018-05-14 12:02:14.954",
    "pendingEvalSentDate": "2018-05-14 12:02:14.955",
  },
  {
    "lastCompletedEvalDate": "2018-05-14 12:02:14.955",
    "pendingEvalSentDate": null,
  }
];

sortByKey(data, 'lastCompletedEvalDate');

console.log(data)


推荐阅读