按角度2+排序对象

时间:2018-10-29 13:19:17

标签: angular

我有个奇怪的问题。我有简单的注释界面:

export interface Comment {
  time: number;
  text: string;
}

时间显示自添加以来经过了多少天。我想用我的排序函数对Comment数组进行排序:

comments.sort((a, b) => {
  if (a.time < b.time) return -1;
  if (a.time > b.time) return 1;
  return 0;
})

问题在于,注释的天数相同。他们似乎没有排序。当我添加新评论时,我希望该评论位于最前面。如何解决?

问题链接:stackblitz

2 个答案:

答案 0 :(得分:2)

快速修复

在排序之前,只需将最新的放在最前面即可。

 onAddCommentEnter(commentText) {
   this.comments = [{text: commentText, date: 0}, ...this.comments].sort((a, b) => {
     if (a.date < b.date) return -1;
     if (a.date > b.date) return 1;
    return 0;
  })
}

https://stackblitz.com/edit/angular-2ggm4v

答案 1 :(得分:1)

如果您唯一的排序参数是创建注释的日期,那么实际上您的订单顺序就无法确定,因为无法确定当天早些时候和晚些时候添加了哪些注释。要按时间顺序排列,可以将“时间:数字”替换为“时间:日期”,从而使毫秒级的注释排序精度。

接口:

export interface Comment {
    time: Date;
    text: string;
}

添加新评论:

this.comments.push(
  {text: commentText, date: new Date()}
)

this.comments = comments.sort((a: Comment, b: Comment) => {
    return b.date.getTime() - a.date.getTime();
})

这将按时间顺序显示注释;最新的评论在顶部,最旧的在底部。要反转此顺序,只需在简写功能中切换“ a”和“ b”即可。

添加新评论时,只需调用Date()构造函数即可获取当前时间。 如果只想显示创建注释的日期,则可以使用Date的getDate()方法进行显示(所有方法均在此处记录:https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Date

OR

如果您对持久性顺序不感兴趣,则可以简单地在数组的开头添加新条目:

this.comments.unshift(
   {text: commentText, date: new Date()}
);

还有一些最佳做法:

  • 实际上实现您上面粘贴的接口,并使用它来键入变量。
  • 尽可能避免使用“ any”,因为这将使TypeScript为您提供的优势失效。

希望我能帮上忙。