Lodash:orderBy如何通过将排序列表文档放在不需排序的字段的顶部?

问题描述

我正在使用Firebase和Firestore,并且有一个名为singers的旧集合,其中包含具有某些构造的文档,例如

name: string
genre: string,...

现在,我需要从前端的集合中订购这些文档,并且需要按照从最早到最新的顺序进行操作,但是如果没有createdAt之类的字段,我将无法执行,因为firestore并不提供有关文档创建时间的任何信息。

我做什么

首先在注册添加了字段createdAt,现在新创建的歌手具有字段createdAt,但旧歌手则没有。所以我想按顺序订购它:

  1. 所有歌手(无字段createdAt或其他任意字段的歌手)
  2. 字段为createdAt的歌手从最早的到最新的

示例数据

const singers = [
  {
    name: 'Phil',genre: 'Pop',...
  },{
    name: 'Bom',genre: 'Rock',{
    name: 'Tom',genre: 'Hiphop',createdAt: 190000000,{
    name: 'John',createdAt: 195000000,]

const sortedSingers = orderBy(
    singers,// collection with all singers from firestore 
    [singer => (singer.createdAt?? singer.name)],['desc'],);

它以错误的顺序呈现:

  1. 汤姆
  2. 约翰
  3. Bom
  4. 菲尔

我想这样订购:

  1. Bom / Phil
  2. Bom / Phil
  3. 汤姆
  4. 约翰

如何使orderBy的无序字段的文档排在列表的开头?

解决方法

我做了这样的事情:

  const singerCreatedAt: any = singers.map((singer: Singer) =>
    singer.createdAt
      ? { ...singer,createdAt: singer.createdAt?.toDate() }
      : { ...singer,createdAt: new Date(190000000000) },);

  const sortedSingers = orderBy(singerCreatedAt,['createdAt','asc']);