【问题标题】:lodash - order dates with skipping year valuelodash - 带有跳过年份值的订单日期
【发布时间】:2018-12-26 16:49:46
【问题描述】:
var dates = ['2017-02-01', '2017-01-01', '2016-02-03', '2018-02-02', '2014-12-25'];
var orderedDates = dates.sort(); // ['2017-01-01', '2017-02-01', '2018-02-02', '2016-02-03', '2014-12-25']

我收集了不同年份的日期(时刻对象)。我只需要按“ddMM”格式(如跳过年份)对这些日期进行排序。

有没有办法做到这一点?

创建dates 数组的副本,为所有日期设置同一年 - 似乎不是一个好的解决方案。

用于排序使用 lodash .orderBy

【问题讨论】:

  • 如果您只想对日期和月份执行排序,则必须将年份和 ddMM 分开。然后对ddMM进行排序。但是您还必须在对 ddMM 执行排序时跟踪年份。所以你必须创建一个 obj 类型的日期。那么你必须在 ddMM 属性上使用 _.orderBY 。您将获得日期对象的排序数组。
  • 我刚刚创建了这个,如果您已经尝试过这个方法,请跳过。 var _ = require('lodash') var dates = ['2017-02-01', '2017-01-01', '2016-02-03', '2018-02-02']; var o = dates.map((d)=> { var s = d.split("-") return { year: s[0], ddMM: s[1] + "-" + s[2] } }) console.log(_.orderBy(o, ['ddMM'], ['asc']))
  • @varatharajan hm,谢谢,会检查
  • 您能否将预期输出添加到您的问题中?
  • @Akrion 就像代码行中的注释

标签: javascript sorting momentjs lodash


【解决方案1】:

您应该使用“MMDD”格式而不是“DDMM”。

而且没有必要将它转换回片刻,因为它只是对数组进行排序。

var orderedDates = _.orderBy(dates, e => moment(e).format('MMDD'));

【讨论】:

    【解决方案2】:

    您可以将orderBy 与指定所需顺序的函数数组一起使用(其中函数从moment 对象中获取datemonth):

    const date = (s) => moment(s, 'YYYY-MM-DD');
    const dates = [date('2017-02-01'), date('2017-01-01'), date('2016-02-03'), date('2018-02-02'), date('2014-12-25')];
    
    const result = _.orderBy(dates, [m => m.date(), m => m.month()]);
    console.log(result);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

    【讨论】:

    • @demo 我相信这是您想要的顺序:['2017-01-01', '2017-02-01', '2018-02-02', '2016-02-03', '2014-12-25'],这是我运行 sn-p 时得到的?
    • 我看到的[ "2016-12-31T22:00:00.000Z", "2017-01-31T22:00:00.000Z", "2018-02-01T22:00:00.000Z", "2016-02-02T22:00:00.000Z", "2014-12-24T22:00:00.000Z" ]
    • @demo 这很奇怪。我创建了一个小提琴,并在控制台中得到了正确的输出:jsfiddle.net/481qypvr 不管怎样,如果你已经有了答案,不用担心。
    • hmmm,奇怪......也许堆栈上有一些错误:D 因为我从你的 sn-p 运行代码并得到我在上面发布的结果......我没有看到 2016-12-31T22:00:00.000Z 甚至不存在在输入数组中......所以不知道
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多