Javascript中高效的可读日期字符串排序算法

Javascript中高效的可读日期字符串排序算法,javascript,reactjs,sorting,date,momentjs,Javascript,Reactjs,Sorting,Date,Momentjs,我正在尝试对React表中数据库中的数千个日期字符串进行排序。我使用的组件允许用户通过单击最上面一行对信息进行排序,API是 我最初编写了sort函数,使用moment.js检查输入排序的字符串是否有效,如果有效,则获取该日期字符串的总毫秒值,从数组中的后续值中减去它,然后返回结果 然而,事实证明,这个过程是劳动密集型的,导致排序功能在浏览器上运行时出现延迟。相关代码如下所示: let isValidDate = (date) => moment(date,'MMM D, YYYY hh:

我正在尝试对React表中数据库中的数千个日期字符串进行排序。我使用的组件允许用户通过单击最上面一行对信息进行排序,API是

我最初编写了sort函数,使用
moment.js
检查输入排序的字符串是否有效,如果有效,则获取该日期字符串的总毫秒值,从数组中的后续值中减去它,然后返回结果

然而,事实证明,这个过程是劳动密集型的,导致排序功能在浏览器上运行时出现延迟。相关代码如下所示:

let isValidDate = (date) => moment(date,'MMM D, YYYY hh:mm a', true).isValid();

function sort(a, b) { // Sorting algorithm 
    if(isValidDate(a) && isValidDate(b)){
      return 
      if(moment(b).valueOf() < moment(a).valueOf()){
        return -1;
      }
      if(moment(b).valueOf() > moment(a).valueOf()){
        return 1;
      }
    }
    return 0;
  }
let isValidDate=(date)=>time(date,'MMM D,YYYY hh:mm a',true).isValid();
函数排序(a,b){//排序算法
if(有效期(a)&有效期(b)){
回来
if(力矩(b).valueOf()<力矩(a).valueOf()){
返回-1;
}
如果(力矩(b).valueOf()>力矩(a).valueOf()){
返回1;
}
}
返回0;
}
由于我的表显示日期(作为人类可读的字符串)的方式,我需要某种方法来更有效地按时间对字符串进行排序。有人对如何做到这一点有什么建议吗?我正在对数千个值进行排序,而这个解决方案又太慢了


谢谢

我假设这些字符串是您的状态数据的一部分。我不只是存储字符串(如果您正在这样做的话),而是将日期值作为数字(从纪元开始的毫秒数)和人类可读的字符串分别存储对象。然后,排序回调可以直接使用数字,而不必不断地重新解析字符串

实例:

类示例扩展了React.Component{
建造师(道具){
超级(道具);
此.state={
列表:props.list.map(strValue=>({
dateValue:moment(strValue,'MMM D,YYYY hh:mm a').valueOf()| | 0,/`| | | 0',因为如果日期无效,'valueOf`将返回NaN;我们将替换为0
标准值
}))
};
this.sortAscending=this.sortAscending.bind(this);
this.sortDescending=this.sortDescending.bind(this);
}
排序{
this.setState(({list})=>({
list:list.slice().sort((a,b)=>a.dateValue-b.dateValue)
}));
}
sortdescing(){
this.setState(({list})=>({
list:list.slice().sort((a,b)=>b.dateValue-a.dateValue)
}));
}
render(){
const{list}=this.state;
返回(
{list.map({strValue},index)=>(
{strValue}
))}
);
}
}
常数列表=[
“2017年1月2日上午12:55”,
“2012年11月17日上午09:06”,
“2015年5月19日上午05:20”,
“2015年5月3日下午12:30”,
“2011年11月13日下午01:44”,
“2012年6月25日03:23”,
“2017年12月12日下午7:42”,
“2011年12月12日凌晨04:51”,
“2016年10月31日上午05:56”,
“2013年1月11日下午12:17”,
“2018年6月20日晚上7:05”,
“2013年3月21日凌晨04:23”,
“2010年10月8日下午6:37”,
“2011年6月23日凌晨4:00”,
“2016年2月16日上午08:57”,
“2016年7月10日晚上10:03”,
“2015年11月16日下午12:17”,
“2013年7月7日上午05:53”,
“2016年10月11日下午11:52”,
“2015年5月20日下午1:00”,
“2016年10月4日上午10:06”,
“2015年8月27日上午6:16”,
“2013年2月24日上午7:39”,
“2018年7月28日晚上10:06”,
“2018年11月2日03:24”,
“2016年4月23日晚上9:36”,
“2010年4月11日上午05:21”,
“2014年5月16日晚上7:52”,
“2011年9月17日下午5:25”,
“2010年9月25日上午11:55”,
“2016年1月30日凌晨01:43”,
“2017年9月20日08:23”,
“2010年2月6日下午01:41”,
“2009年7月1日上午07:05”,
“2013年7月12日下午03:42”,
“2011年6月21日凌晨02:57”,
“2015年1月16日下午5:55”,
“2012年3月11日下午5:19”,
“2013年12月22日下午6:34”,
“2012年10月29日上午7:20”,
“2015年5月26日凌晨04:00”,
“2017年2月21日上午09:34”,
“2015年3月31日下午03:37”,
“2011年1月24日下午11:31”,
“2017年5月28日凌晨03:45”,
“2010年1月19日下午6:45”,
“2016年7月31日凌晨03:29”,
“2011年5月27日上午12:12”,
“2014年12月7日晚上11:27”,
“2016年10月10日凌晨02:48”
];
ReactDOM.render(
,
document.getElementById(“根”)
);

TJ的答案有效。正如他所建议的那样,我最终改变了后端,将日期作为数字返回

但是,如果我没有这样做,我发现另一个更快的解决方案是这个排序函数,它利用了moment.js在无法解析字符串时返回NaN的事实:

let date1 = moment(a[orderBy]).valueOf();
let date2 = moment(b[orderBy]).valueOf();

    if(isNaN(date1) || isNaN(date2)){
      return 0;
    }

    if(date2 < date1){
      return -1;
    }
    if(date2 > date1){
      return 1;
    }
  };
let date1=力矩(a[orderBy]).valueOf();
设date2=力矩(b[orderBy]).valueOf();
如果(伊斯南(日期1)|伊斯南(日期2)){
返回0;
}
如果(日期2<日期1){
返回-1;
}
如果(日期2>日期1){
返回1;
}
};

您能给我们提供更多的上下文吗?想必,您的UI中不仅仅有一长串字符串,还有组件/元素中的字符串。。。您所在州的数据是什么样子的?您需要
返回0最后,对于相同的有效日期。:-)更简单的版本是:
let date1=moment(a[orderBy]).valueOf();设date2=/*…*/;返回isNaN(日期1)| isNaN(日期2)?0:date2-date1更简单的
返回(矩(date2,'MMM D,YYYY hh:mm a',true)。valueOf()-矩(date1,'MMM D,YYYY hh:mm a',true)。valueOf())| 0
;-)