微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Lodash顺序按升序和降序排列的日期不起作用

如何解决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 举报,一经查实,本站将立刻删除。