前情提要
- 今天在做一个笔记项目的时候,调用接口给我返回了当前用户的笔记列表,是个对象数组
data,如下图
-
对象里的内容格式如下
-
现在我有一个需求,要按照添加的时间
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() 方法比较两个值时,将值发送给比较函数,根据返回的(负、零、正)值对值进行排序。