我有一个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
}
]
}
我该怎么做?
谢谢。
答案 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
进行排序。