Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按日期对对象数组进行排序';无法正常工作,忽略年份值_Javascript_Sorting - Fatal编程技术网

Javascript 按日期对对象数组进行排序';无法正常工作,忽略年份值

Javascript 按日期对对象数组进行排序';无法正常工作,忽略年份值,javascript,sorting,Javascript,Sorting,我有一个项目的对象数组,它们的工作方式有点像博客的条目。然后,我尝试按照每个条目的发布日期(最近的第一个条目)对条目进行排序,但是,显然排序函数没有考虑年份值或者我遗漏的其他问题 示例情况 其中一个条目于2019年6月23日发布,它是输出数组的第一个值,因为它是具有最新日期的条目。但如果我尝试将其年份改为2005年,它将保持在顶部,就像函数忽略年份一样。我还尝试将其更改为0,但结果保持不变 我用的代码 对象数组中的示例项 对于日期,我使用了另一个数组,其中索引0表示日,索引1表示月,索引2表示年

我有一个项目的对象数组,它们的工作方式有点像博客的条目。然后,我尝试按照每个条目的发布日期(最近的第一个条目)对条目进行排序,但是,显然排序函数没有考虑年份值或者我遗漏的其他问题

示例情况 其中一个条目于2019年6月23日发布,它是输出数组的第一个值,因为它是具有最新日期的条目。但如果我尝试将其年份改为2005年,它将保持在顶部,就像函数忽略年份一样。我还尝试将其更改为0,但结果保持不变

我用的代码 对象数组中的示例项 对于日期,我使用了另一个数组,其中索引0表示,索引1表示,索引2表示

[{Id: "P3", Date: [23, 6, 2019]}, ...]
排序功能 我使用日期数组的三个值来计算自第0天起的总天数并比较它们(最大天数=最近的条目)

array.sort((a,b)=>((a.Date[0]+(a.Date[1]*30)+(a.Date[2]*365))<(b.Date[0]+(b.Date[1]*30)+(b.Date[2]*365))?1:-1)).map(item=>item.Id)
该函数按顺序输出一个数组,其中包含它们引用的条目的Id


任何修复我的代码的帮助都会很有帮助,非常感谢:)

使用JavaScript数据类型“Date”而不是数组格式。然后比较日期进行排序

更改代码

[{Id: "P3", Date: [23, 6, 2019]}, ...]

通过此更改,您可以按如下方式对对象进行排序

array.sort(function(a,b){
var date1 = new Date(a.date);
var date2 = new Date(b.date);
return date1 > date2? 1:-1;
});

您最好使用日期库来比较日期数据,例如:。

试试这个

函数convertDateToNumber(日期){
返回编号(日期[2]+日期[1]。toString().padStart(2,0)+日期[0]。toString().padStart(2,0));
}
变量日期=[
{Id:“P3”,日期:[2019年6月23日]},
{Id:“P4”,日期:[2019年3月6日]},
{Id:“P5”,日期:[2019年12月23日]},
{Id:“P6”,日期:[2019年7月23日]},
{Id:“P7”,日期:[2019年12月3日]}
];
日期.排序((a,b)=>{
var aNumber=convertDateToNumber(a.Date);
var bNumber=convertDateToNumber(b.日期);
如果(数量数量){
返回1;
}
返回0;
});

控制台日志(日期)
有些月份超过30天,有些年份超过365天。使用
31
366
而不是
30
365
。为什么不使用
Date
对象而不是数组呢?是的,但是
'23,6,2019'
不是一种合适的日期格式!我在评论中建议使用正确的日期格式。但为什么不自己使用正确的日期格式呢?会让答案变得更好。您已经更改了值吗?
[{Id: "P3", date: '23/6/2019'/*use proper date format*/}, ...]
array.sort(function(a,b){
var date1 = new Date(a.date);
var date2 = new Date(b.date);
return date1 > date2? 1:-1;
});