首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对包含日期数组的对象数组进行排序。

对包含日期数组的对象数组进行排序。
EN

Stack Overflow用户
提问于 2021-03-05 22:26:32
回答 2查看 721关注 0票数 1

我目前正在尝试对一个对象数组进行排序,每个对象都包含一个日期数组。数据结构如下所示:

代码语言:javascript
运行
复制
const array = [
  {
    name: "Judith",
    cal: {
      ti: [
        "2021-03-09T15:00:00Z",
        "2021-03-09T15:30:00Z",
        "2021-03-16T14:00:00Z"
      ]
    }
  },
  {
    name: "billy",
    cal: {
      ti: [
        "2021-03-05T14:30:00Z",
        "2021-03-08T14:00:00Z",
        "2021-03-08T14:30:00Z"
      ]
    }
  }
]

我试图使用称为dayjs的日期库,根据最近可用的时间对数组进行排序。我试图在dayjs包中使用diff方法比较每个日期数组,如下所示:

代码语言:javascript
运行
复制
const test = array.map(i => i.cal.ti.sort((a, b) => {
 dayjs(a).diff(dayjs(b))
}))

console.log(test)

我想对数组中包含的对象进行排序,首先用最近的可用时间返回对象,以此类推。我注意到我在这类中不正确地返回,我相信我也有一大堆问题在进行,在那里我没有正确地比较日期,导致我的数组失败。

附件是用于调试的repl.it:

https://repl.it/@rterrell25/LegalJaggedCoordinate#index.js

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-05 22:54:59

试试这个:

代码语言:javascript
运行
复制
const array = [
  {
    name: "Judith",
    cal: {
      ti: [
        "2021-03-16T14:00:00Z",
        "2021-03-09T15:00:00Z",
        "2021-03-09T15:30:00Z",
        "2021-03-19T15:30:00Z",
        "2021-02-19T15:30:00Z",
      ]
    }
  },
  {
    name: "billy",
    cal: {
      ti: [
        "2021-03-08T14:00:00Z",
        "2021-03-05T14:30:00Z",
        "2021-02-25T14:30:00Z",
        "2021-03-25T14:30:00Z",
        "2021-03-08T14:30:00Z"
      ]
    }
  }
];

const now = new Date();

array.forEach(i => i.cal.ti.sort((a, b) =>
    Math.abs(new Date(a) - now)
    - Math.abs(new Date(b) - now)
));

array.sort((a, b) =>
    Math.abs(new Date(a.cal.ti[0]) - now)
    - Math.abs(new Date(b.cal.ti[0]) - now)
);

console.log(array);

票数 1
EN

Stack Overflow用户

发布于 2021-03-05 22:40:59

在您的测试数据中,日期已经被排序,所以这可能会扭曲您对已经发生的事情的看法。

我重新排序了测试数据,以便它们启动未排序,然后非常轻微地更改排序,以便它返回-1或1(这是应该返回的排序函数):

代码语言:javascript
运行
复制
const array = [
  {
    name: "Judith",
    cal: {
      ti: [
        "2021-03-16T14:00:00Z",
        "2021-03-09T15:00:00Z",
        "2021-03-09T15:30:00Z",
      ]
    }
  },
  {
    name: "billy",
    cal: {
      ti: [
        "2021-03-08T14:00:00Z",
        "2021-03-05T14:30:00Z",
        "2021-03-08T14:30:00Z"
      ]
    }
  }
]
const test = array.map(i => i.cal.ti.sort((a, b) => (dayjs(a).isAfter(dayjs(b)) ? 1 : -1)))
 
 console.log(test)

更新

代码语言:javascript
运行
复制
const test = array.sort((a,b) => {
  let aFirst = a.cal.ti.map(i => dayjs(i)).sort((a1,b1) => a1.isAfter(b1) ? 1 : -1)[0]
  let bFirst = b.cal.ti.map(i => dayjs(i)).sort((a1,b1) => a1.isAfter(b1) ? 1 : -1)[0]
  return aFirst.isAfter(bFirst) ? 1 : -1
})
 console.log(test)

排序dayjs对象的方法来自这里的建议(https://github.com/iamkun/dayjs/issues/328)

关于返回的注意事项--如果使用{}包装函数体,则应该在大括号内使用return。您将注意到,在我的排序函数中,没有任何大括号--在本例中,单行函数的返回值是自动获取的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66500374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档