Angular 日期为'的排序表';

Angular 日期为'的排序表';,angular,typescript,sorting,Angular,Typescript,Sorting,因此,我有以下用例,其中我在表中有日期和空字符串 问题是排序没有达到我预期的效果。 通常,对于字符串,它会将空字符串放在排序的顶部或底部 但随着时间的推移,它将他们推到了中间 json = ['01-01-2018', '', '04-03-2018', '03-03-2018', '', '04-03-2018', '03-03-2018']; this.json.sort((obj1: string, obj2: string) => { if (new Date(obj1) &g

因此,我有以下用例,其中我在表中有日期和空字符串

问题是排序没有达到我预期的效果。 通常,对于字符串,它会将空字符串放在排序的顶部或底部

但随着时间的推移,它将他们推到了中间

json = ['01-01-2018', '', '04-03-2018', '03-03-2018', '', '04-03-2018', '03-03-2018'];
this.json.sort((obj1: string, obj2: string) => {
  if (new Date(obj1) > new Date(obj2)) { return 1; }
  if (new Date(obj1) < new Date(obj2)) { return -1; }
  return 0;
});
json=['01-01-2018'、''04-03-2018'、'03-03-2018'、''04-03-2018'、'03-03-2018'];
this.json.sort((obj1:string,obj2:string)=>{
if(新日期(obj1)>新日期(obj2)){return 1;}
if(新日期(obj1)<新日期(obj2)){return-1;}
返回0;
});
这将导致:
01-01-2018,03-03-2018,04-03-2018,03-03-2018,04-03-2018

下面是一个简单的闪电战:


我试着把它变成一个数字。但是空字符串的问题仍然存在。任何1都有解决方法吗?

您需要检查该值是否可转换为日期/时间类型,如果不可转换,则返回-1或1(取决于您希望它们的位置)

json = ['01-01-2018', '', '04-03-2018', '03-03-2018', '', '04-03-2018', '03-03-2018'];
this.json.sort((obj1: string, obj2: string) => {
  if (obj1 === obj2) { return 0; } // if they are the same then no need to convert these instances to Date types later, just return 0
  if (!obj1) { return 1; } // thruthy check
  if (!obj2) { return -1; } // thruthy check

  if (new Date(obj1) > new Date(obj2)) { return 1; }
  if (new Date(obj1) < new Date(obj2)) { return -1; }
  return 0;
});


另一方面,我建议不要使用javascript的
Date
。它的功能更强大,您可以使用传递的值包含格式字符串,以便正确解析字符串。

检查是否设置了值:

 sort(){
    this.json.sort((obj1: string, obj2: string) => {
      if (!obj1 ||!obj2) {return -1}
      if (new Date(obj1)> new Date(obj2)) { return 1; }
      if (new Date(obj1)< new Date(obj2)) { return -1; }

      return 0;
    });
  }

但是空字符串的问题仍然存在,空字符串的问题是什么?你想要的结果是什么?像这样解析日期字符串从来都不是一个好主意,尤其是如果它们不遵循。行为将高度依赖于实现。这应该行得通。我在代码中尝试了这一点,但它不起作用。我编辑了我的stackblitz,它按预期工作。但在我的代码中,它不是,我必须看看有什么不同。谢谢!我试过了moment.js indead,但最后我还是遇到了同样的问题。@Swoox-你更新的stackblitz对我来说没问题。将html模板代码更改为:
{items[0].date?items[0].date:'empty'}}
,这是否显示了预期的结果?是的,但我的真实代码没有,我只需要找出原因。@Swoox-看到这一点,您需要提供,并且不应该导致不推荐的警告。
 sort(){
    this.json.sort((obj1: string, obj2: string) => {
      if (!obj1 ||!obj2) {return -1}
      if (new Date(obj1)> new Date(obj2)) { return 1; }
      if (new Date(obj1)< new Date(obj2)) { return -1; }

      return 0;
    });
  }
,,01-01-2018,03-03-2018,03-03-2018,04-03-2018,04-03-2018