使用Lodash orderBy无法按日期字段createdDate降序排序
问题根因
- 存入Firebase的
createdDate为dayjs().format()输出的字符串格式,Lodash orderBy对字符串排序时默认按Unicode编码逐字符对比,若DayJS输出的日期字符串并非完整ISO 8601格式(如缺失时区、完整年份信息),会导致排序结果与预期时间顺序不符。 - 若部分数据的
createdDate字段为空、格式与其他条目不一致,也会打乱整体排序逻辑。
修复方案
方案1(推荐)
修改存储逻辑,直接存数值类型的13位毫秒级时间戳,彻底避免字符串排序的兼容问题:
存储时将对应代码修改为:
createdDate: dayjs().valueOf(),
数值类型时间戳的排序与时间顺序完全一致,可直接传入orderBy方法排序,前端展示时也可直接传递给Angular的date管道完成格式化,无需额外转换。
方案2(兼容存量数据)
如果不便修改已入库的历史数据,可在排序阶段主动将createdDate转换为Date类型后再做排序,修改getLeads方法如下:
getLeads(): Observable<LeadModel[]> { return this.angularFireDatabase .list<LeadModel>(`groups/${this.groupId}/leads`) .valueChanges() .pipe(map((res) => orderBy(res, item => new Date(item.createdDate), ['desc']))); }
内容的提问来源于stack exchange,提问作者Sampath
相关产品推荐
相关产品推荐

