【问题标题】:Lodash : orderBy how to put at the top of the ordered list documents without field by which we order?Lodash : orderBy 如何将没有我们排序的字段的文档放在排序列表的顶部?
【发布时间】:2020-10-19 10:50:23
【问题描述】:

我正在使用 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',
    genre: 'Hiphop',
    createdAt: 195000000,
    ...
  },
]

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

而且它以错误的顺序呈现:

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

我想这样订购:

  1. 邦/菲尔
  2. 邦/菲尔
  3. 汤姆
  4. 约翰

如何使orderBy使没有有序字段的文档位于列表的开头?

【问题讨论】:

    标签: firebase google-cloud-firestore lodash


    【解决方案1】:

    我做了这样的事情:

      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']);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-13
      • 2016-01-21
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      相关资源
      最近更新 更多