记一下根据对象数组里的时间戳进行排序的坑

517 阅读1分钟

前情提要

  • 今天在做一个笔记项目的时候,调用接口给我返回了当前用户的笔记列表,是个对象数组 data,如下图

image.png

  • 对象里的内容格式如下 image.png

  • 现在我有一个需求,要按照添加的时间createdAt,从新到旧,从上往下进行排序

基础知识不扎实导致踩的坑

  • 脑子里第一个想到sort,so ez啦~
  • 于是我就用 data.sort((a,b)=> a.createdAt < b.createdAt )实现(其实是因为我少写了点代码,详情请往下看)
  • 结果当然是不行了,这个方法对于一般的简单数字数组是可行的,我没注意到这返回的createdAt是个字符串

我一开始的解决方法

  • 通过 Google和查阅 MDN 文档
  • localeCompare()方法
  • localeCompare()方法返回一个数字来指示一个参考字符串是否在排序顺序前面或之后或与给定字符串相同。
  • 代码如下
// 从大到小排序
data.sort((a,b)=> b.createdAt.localeCompare(a.createdAt))
// 从小到大排序
data.sort((a,b)=> a.createdAt.localeCompare(b.createdAt))
  • 可以解决,排序正常了

后来发现一开始的方法是可行的,加条件判断和返回值即可

降序排序(大→小)

  • data.sort((a,b)=> a.createdAt < b.createdAt ) ? 1 : -1
data.sort(function(a,b){
    if(a<b){
      return 1  
    }
    if(a>b){
      return -1
    }
    return 0
})

升序排序(小→大)

  • data.sort((a,b)=> a.createdAt < b.createdAt ) ? -1 : 1
data.sort(function(a,b){
    if(a<b){
      return -1  
    }
    if(a>b){
      return 1
    }
    return 0
})

补充

  • sort() 方法比较两个值时,将值发送给比较函数,根据返回的(负、零、正)值对值进行排序。