如何按多个日期时间属性排序(最后为null)?

时间:2018-10-02 16:00:43

标签: javascript sql-order-by lodash

我有一个json,我想通过多个日期时间属性订购此json。但是有一个pinnedAt属性,它指出帖子必须位于最上面。我在用lodash。

这是我要解释的sql文档:

  

如果指定了NULLS LAST,则空值将排在所有非空值之后;如果指定了NULLS FIRST,则空值将在所有非空值之前排序。如果未指定,则默认行为是在指定或隐含ASC时为NULLS LAST,而在指定DESC时为NULLS FIRST(因此,默认值表示空值大于非空值)。指定USING时,默认的空值排序取决于运算符是小于运算符还是大于运算符。

您可以在此处了解更多信息:https://www.postgresql.org/docs/9.0/static/sql-select.html


这是我的示例数据:

{
  "data": [
    {
      "name": "Paris",
      "createdAt": "2018-10-01T08:28:05.074Z",
      "pinnedAt": null
    },
    {
      "name": "New York",
      "createdAt": "2018-10-01T05:16:05.074Z",
      "pinnedAt": null
    },
     {
      "name": "Washington",
      "createdAt": "2018-10-02T08:28:05.074Z",
      "pinnedAt": "2018-10-02T15:19:23.245Z"
    }
  ]
}

我要订购的代码

posts = _.orderBy(state.posts, ['pinnedAt', 'createdAt'], ['desc', 'desc']);

但是这不符合我想要的顺序。这是我所期望的

{
  "data": [
    {
      "name": "Washington",
      "createdAt": "2018-10-02T08:28:05.074Z",
      "pinnedAt": "2018-10-02T15:19:23.245Z"
    },
    {
      "name": "Paris",
      "createdAt": "2018-10-01T08:28:05.074Z",
      "pinnedAt": null
    },
    {
      "name": "New York",
      "createdAt": "2018-10-01T05:16:05.074Z",
      "pinnedAt": null
    }
  ]
}

我该怎么做?

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用自定义函数将null视为可以正确排序的其他值。

const data = [
    {
      "name": "Paris",
      "createdAt": "2018-10-01T08:28:05.074Z",
      "pinnedAt": null
    },
    {
      "name": "New York",
      "createdAt": "2018-10-01T05:16:05.074Z",
      "pinnedAt": null
    },
    {
      "name": "Washington",
      "createdAt": "2018-10-02T08:28:05.074Z",
      "pinnedAt": "2018-10-02T15:19:23.245Z"
    }
]; 

const result = _.orderBy(data, 
                         [(item) => item.pinnedAt ? item.pinnedAt : "", 'createdAt'], 
                         ['desc', 'desc']);

使用https://npm.runkit.com/lodash使用lodash的4.17.11版进行了测试


之所以起作用,是因为空字符串“小于”任何其他字符串值。降序排序时,它将始终显示在列表的末尾。由于这些空字符串值是等效的,因此按预期,不包含pinnedAt的对象将基于createdAt进行排序。