如何解决Lodash顺序按升序和降序排列的日期不起作用
我正在寻找moment()
和lodash
中的React Web应用程序的解决方案,以按升序和降序对日期进行排序。不幸的是,所有解决方案都无法使用。
const items = {
pageNumber: 1,totalPages: 1,content: [{
id: 8,created: "2020-10-14T15:05:48.427601Z",actor: "Anonymous",rangeStart: "2020-10-14T11:54:05.610220Z",rangeEnd: "2020-10-14T15:05:48.461905Z",state: "InProgress",amountOrderIds: 0,amountOrderDetails: 0
},{
id: 3,created: "2020-8-11T11:54:05.610220Z",actor: "houman",rangeStart: "2020-10-11T11:54:05.610220Z",rangeEnd: "2020-10-14T11:54:05.610220Z",state: "Finished",{
id: 2,created: "2020-9-10T11:53:40.262608Z",actor: "mo",rangeStart: "2020-10-10T11:53:40.262608Z",rangeEnd: "2020-10-11T11:53:40.262608Z",{
id: 1,created: "2020-10-09T11:53:25.911596Z",actor: "leo",rangeStart: "2020-10-09T11:53:25.911596Z",rangeEnd: "2020-10-10T11:53:25.911596Z",amountOrderDetails: 0
}
]
};
const sortByAsc = item => _.orderBy(item,() => moment(item.created),['asc'])
const sortedAscList = (backorders) => {
const newBackorders = _.cloneDeep(backorders)
return _(newBackorders)
.orderBy(sortByAsc)
.compact()
.value()
}
const sortByDesc = item => _.orderBy(item,['desc'])
const sortedDescList = (backorders) => {
const newBackorders = _.cloneDeep(backorders)
return _(newBackorders)
.orderBy(sortByDesc)
.compact()
.value()
}
console.clear();
console.log('----------sortByAsc------------');
console.log(sortedAscList(items.content));
console.log('----------sortByDesc------------');
console.log(sortedDescList(items.content));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.1/moment.min.js"></script>
解决方法
执行a chain时,您将对整个数据集进行操作。因此,调用orderBy
不需要在回调中调用另一个_.orderBy
。相反,您需要使用两个参数来调用它-第一个参数通常是集合,它是您对链式操作应用隐式包装的值。
const sortByAsc = item => _.orderBy(item,() => moment(item.created),['asc'])
/* ... */
_(newBackorders)
.orderBy(sortByAsc)
需要变得简单:
/* ... */
_(newBackorders)
.orderBy(item => moment(item.created),['asc'])
可以进行类似的降序转换。
const items = {
pageNumber: 1,totalPages: 1,content: [{
id: 8,created: "2020-10-14T15:05:48.427601Z",actor: "Anonymous",rangeStart: "2020-10-14T11:54:05.610220Z",rangeEnd: "2020-10-14T15:05:48.461905Z",state: "InProgress",amountOrderIds: 0,amountOrderDetails: 0
},{
id: 3,created: "2020-8-11T11:54:05.610220Z",actor: "houman",rangeStart: "2020-10-11T11:54:05.610220Z",rangeEnd: "2020-10-14T11:54:05.610220Z",state: "Finished",{
id: 2,created: "2020-9-10T11:53:40.262608Z",actor: "mo",rangeStart: "2020-10-10T11:53:40.262608Z",rangeEnd: "2020-10-11T11:53:40.262608Z",{
id: 1,created: "2020-10-09T11:53:25.911596Z",actor: "leo",rangeStart: "2020-10-09T11:53:25.911596Z",rangeEnd: "2020-10-10T11:53:25.911596Z",amountOrderDetails: 0
}
]
};
const sortedAscList = (backorders) => {
const newBackorders = _.cloneDeep(backorders)
return _(newBackorders)
.orderBy(item => moment(item.created),['asc'])
.compact()
.value()
}
const sortedDescList = (backorders) => {
const newBackorders = _.cloneDeep(backorders)
return _(newBackorders)
.orderBy(item => moment(item.created),['desc'])
.compact()
.value()
}
console.clear();
console.log('----------sortByAsc------------');
console.log(sortedAscList(items.content));
console.log('----------sortByDesc------------');
console.log(sortedDescList(items.content));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.1/moment.min.js"></script>
但是,这并不是唯一的改进。不需要Moment.JS库-ISO 8601日期正确格式化时,自然会按时间顺序对它们进行排序。因此,如果您可以将月份固定为从零开始,例如:
"2020-9-10T11:53:40.262608Z"
到
"2020-09-10T11:53:40.262608Z"
这意味着您可以使用:
_(newBackorders)
.orderBy("created",'asc')
const items = {
pageNumber: 1,created: "2020-08-11T11:54:05.610220Z",created: "2020-09-10T11:53:40.262608Z",amountOrderDetails: 0
}
]
};
const sortedAscList = (backorders) => {
const newBackorders = _.cloneDeep(backorders)
return _(newBackorders)
.orderBy("created",'asc')
.compact()
.value()
}
const sortedDescList = (backorders) => {
const newBackorders = _.cloneDeep(backorders)
return _(newBackorders)
.orderBy("created",'desc')
.compact()
.value()
}
console.clear();
console.log('----------sortByAsc------------');
console.log(sortedAscList(items.content));
console.log('----------sortByDesc------------');
console.log(sortedDescList(items.content));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
如果您想归纳排序功能以最大程度地减少代码重复,则可以将其作为咖喱函数:
const items = { pageNumber: 1,content: [{ id: 8,amountOrderDetails: 0 },{ id: 3,{ id: 2,{ id: 1,amountOrderDetails: 0 } ] };
const sortList = order => (backorders) => {
const newBackorders = _.cloneDeep(backorders)
return _(newBackorders)
.orderBy("created",order)
.compact()
.value()
}
const sortedAscList = sortList('asc');
const sortedDescList = sortList('desc');
console.clear();
console.log('----------sortByAsc------------');
console.log(sortedAscList(items.content));
console.log('----------sortByDesc------------');
console.log(sortedDescList(items.content));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
或者,使用_.partial
:
const items = { pageNumber: 1,amountOrderDetails: 0 } ] };
const sortList = (order,backorders) => {
const newBackorders = _.cloneDeep(backorders)
return _(newBackorders)
.orderBy("created",order)
.compact()
.value()
}
const sortedAscList = _.partial(sortList,'asc');
const sortedDescList = _.partial(sortList,'desc');
console.clear();
console.log('----------sortByAsc------------');
console.log(sortedAscList(items.content));
console.log('----------sortByDesc------------');
console.log(sortedDescList(items.content));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。