Javascript 使用对象日期属性对数组排序
我有一个包含如下对象的数组:Javascript 使用对象日期属性对数组排序,javascript,reactjs,typescript,Javascript,Reactjs,Typescript,我有一个包含如下对象的数组: { Title: "Title", Url: "myUrl", publishedDate: "19/01/2021" }, { Title: "Title 2", Url: "myUrl", publishedDate: "17/12/2020" }, { Title: "Title 3", U
{
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"
}
我已将它们保存在我的状态(数组)
我想根据属性“publishedDate”(由于内存效率的原因,不使用新的日期())对对象进行排序。我尝试:
但是这些物体不整齐。代码中有什么错误?游乐场:
您可以使用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(函数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]);
返回c-d;
}))
如果日期格式始终相同,您只需以YYYYMMDD
格式创建字符串,然后进行比较-
var数据=[{
标题:“标题”,
Url:“我的Url”,
发布日期:“19/01/2021”
}, {
标题:“标题2”,
Url:“我的Url”,
发布日期:“17/12/2020”
}, {
标题:“标题3”,
Url:“我的Url”,
发布日期:“11/03/2021”
}, {
标题:“标题4”,
Url:“我的Url”,
发布日期:“11/12/2020”
}]
var sortedData=data.sort(函数(a,b){
a=a.publishedDate.split('/').reverse().join('');
b=b.publishedDate.split('/').reverse().join('');
返回a>b1:a 控制台日志(sortedData)
“由于内存效率,没有使用新日期()”——“为什么新日期()
会成为问题?因为在排序函数中分配内存。这里已经讨论过了:你自己尝试过解决这个问题吗?将日期拆分为各个部分并进行比较应该不会那么困难。如果您可以这样做,只需编写自己的compareDates函数和good to go。用“/”作为分隔符,将日期分成三部分。只有一条注释,没有任何进一步的事实来证明其假设。如果不使用分析器进行详尽的分析,你真的不应该考虑“内存效率”。Andreas说得好,谢谢Date.UTC()
在“内存效率”方面没有太大变化,但“限制”一开始就毫无意义……我想这只是另一种方式,如果OP希望避免新的Date(),我没问题:-)@Andreas“但这种“限制”一开始就毫无意义。”我想你对我的申请很了解我不明白你为什么要这样“监视”周围,这对我来说毫无意义,而且这不是我第一次看到你这样。
this.state.data
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();
}))