【问题标题】:Sort an array with objects date property使用对象日期属性对数组进行排序
【发布时间】:2021-03-29 02:13:16
【问题描述】:

我有一个包含如下对象的数组:

{
 Title: "Title",
 Url: "myUrl",
 publishedDate: "19/01/2021"
  },
  {
   Title: "Title 2",
Url: "myUrl",
publishedDate: "17/12/2020"
  },
  {
  Title: "Title 3",
Url: "myUrl",
publishedDate: "11/03/2021"
  },
  {
Title: "Title 4",
Url: "myUrl",
publishedDate: "11/12/2020"
  }

我已将它们保存在我的状态(数组)中。

this.state.data

我想根据属性“publishedDate”对对象进行排序(由于内存效率,不使用 new Date())。我试试:

console.log(this.state.data.sort(function(a, b) {
  var c = new Date(a.publishedDate);
  var d = new Date(b.publishedDate);
  return c.getTime() - d.getTime();
}))

但对象不按顺序排列。代码有什么问题?游乐场:

https://www.typescriptlang.org/play?#code/FAYw9gdgzgLgBAQwE5IQTzgXjgb2HOAEwRgQC44BtPOAFQEsYAbAUwoCIHmX2AafAKpImHALZohTPvgAOAVwBGTelAAWLQgBESbOOwCMATgD0ABn3GATKcv72+OAF9+BGgS6sOHlnEvTJYhLC0vJKKupaOhz6AOzG+pZWNqb2BM4Obt5ejKxwAMz+woGSIYrKahraMLoGFqZ5SbapTi64wFl63nAALIUieuIl-KHlEVU1+hYJjSkOjg4AusDzwKCQUGCsAHRMYADmABTIqGhbxKRbG0gwBwBmchAgMPSQR7xwCgCUbQQAbshwEBYOAQFgAdzg4yOWxG4UqOk+AG4HP8kERgaCIVCFDCynDItUkQ4kCwYHIkBBAVs9qSGKIWAdvgBaIjU2n0emM5GOT6fYBAA

【问题讨论】:

  • “并且由于内存效率问题而没有使用新的 Date()” - 为什么new Date() 会成为问题?
  • 因为在排序函数内部分配内存。在这里讨论过:stackoverflow.com/questions/10123953/…
  • 你有什么尝试自己解决这个问题的?将日期拆分为各个部分并进行比较应该不难
  • 是的,您可以这样做,只需编写您自己的 compareDates 函数即可。使用“/”作为分隔符在他的 3 个组件中拆分日期
  • 只有一个评论,没有任何进一步的事实来证明其假设。如果没有使用分析器进行详尽的分析,您真的不应该考虑“内存效率”。

标签: javascript reactjs typescript


【解决方案1】:

如果日期格式始终相同,则只需创建格式为YYYYMMDD 的字符串,然后进行比较 -

var data = [{
  Title: "Title",
  Url: "myUrl",
  publishedDate: "19/01/2021"
}, {
  Title: "Title 2",
  Url: "myUrl",
  publishedDate: "17/12/2020"
}, {
  Title: "Title 3",
  Url: "myUrl",
  publishedDate: "11/03/2021"
}, {
  Title: "Title 4",
  Url: "myUrl",
  publishedDate: "11/12/2020"
}]

var sortedData = data.sort(function(a, b) {
  a = a.publishedDate.split('/').reverse().join('');
  b = b.publishedDate.split('/').reverse().join('');
  return a > b ? 1 : a < b ? -1 : 0;
});

console.log(sortedData);

here 的解决方案也提出了相同的建议(以及使用.localeCompare 作为替代方案)

【讨论】:

    【解决方案2】:

    您可以使用 Date.UTC 方法接受年、月索引、日来创建日期并通过解析输入日期字符串来传递这些值,如下所示:

    this.state =  { data: [{ Title: "Title", Url: "myUrl", publishedDate: "19/01/2021" }, { Title: "Title 2", Url: "myUrl", publishedDate: "17/12/2020" }, { Title: "Title 3", Url: "myUrl", publishedDate: "11/03/2021" }, { Title: "Title 4", Url: "myUrl", publishedDate: "11/12/2020" }]}; 
    
    console.log(this.state.data.sort(function(a, b) {
      var c = Date.UTC(a.publishedDate.split("/")[2], a.publishedDate.split("/")[1] - 1, a.publishedDate.split("/")[0]);
      var d = Date.UTC(b.publishedDate.split("/")[2], b.publishedDate.split("/")[1] - 1, b.publishedDate.split("/")[0]);
      return c - d;
    }))

    【讨论】:

    • Date.UTC()“内存效率” 方面并没有太大变化,但首先那个“限制”根本没有意义。 .
    • 我猜这只是另一种方法,如果 OP 希望避免使用 new Date(),我可以 :-)
    • @Andreas “但这种“限制”一开始就没有任何意义。”我想你对我的应用程序有很好的了解。 :) 不明白你为什么要这样“监管”,这对我来说毫无意义,这不是我第一次看到你这样。
    猜你喜欢
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    相关资源
    最近更新 更多