【问题标题】:Typescript: How to sort an array by multiple conditions打字稿:如何按多个条件对数组进行排序
【发布时间】:2021-09-12 17:52:13
【问题描述】:

我有一组未排序的“版本”对象。

export interface Edition {
  name: string;
  edition_code: string;
  parent_code: string;
  released_at: number;
}

每个对象都设置了nameedition_codereleased_at 属性。 parent_code 属性可以为空。

没有parent_code 的版本对象是父版本。 parent_code 等于父版本的edition_code 的所有版本对象都是此父版本的子版本。

我尝试按以下条件对数组进行排序:

  • 所有父版本必须按released_at(最新优先)排序

    • 父版本可以有零个或多个子版本
  • 每个子版本都必须在匹配的父版本对象之后直接排序。 (忽略released_at属性)

    • 子版本必须按名称的字母顺序排序。

我正在尝试使用sort() 方法对数组进行排序。 allEditions()-方法返回一个Observable<Array<Edition>>

this.dataSource = this.editionService.allEditions().pipe(
      map((editions) =>
        editions
          .sort((a, b) => {
            // this is the point where i struggle to create the correct sorting function
          })
      )
    );

示例:

这是一个未排序数组的示例:

[
{
  "name": "Stomper";
  "edition_code": "sto";
  "parent_code": null;
  "released_at": "1587679200000";
},
{
  "name": "Flyer";
  "edition_code": "fly";
  "parent_code": null;
  "released_at": "1619128800000";
},
{
  "name": "Stomper Promos";
  "edition_code": "psto";
  "parent_code": "sto";
  "released_at": "1587679200000";
},
{
  "name": "Stomper Ultra";
  "edition_code": "usto";
  "parent_code": "sto";
  "released_at": "1587679200000";
},
{
  "name": "Flyer Special";
  "edition_code": "sfly";
  "parent_code": "fly";
  "released_at": "1619128800000";
},
{
  "name": "Stomper Extras";
  "edition_code": "esto";
  "parent_code": "sto";
  "released_at": "1587679200000";
},
{
  "name": "Roller";
  "edition_code": "rol";
  "parent_code": null;
  "released_at": "1374184800000";
},
{
  "name": "Flyer Reloaded";
  "edition_code": "rfly";
  "parent_code": "fly";
  "released_at": "1493330400000";
}
]

这是完全相同的数组,但已排序:

[
{
  "name": "Flyer";
  "edition_code": "fly";
  "parent_code": null;
  "released_at": "1619128800000";
},
{
  "name": "Flyer Reloaded";
  "edition_code": "rfly";
  "parent_code": "fly";
  "released_at": "1493330400000";
},
{
  "name": "Flyer Special";
  "edition_code": "sfly";
  "parent_code": "fly";
  "released_at": "1619128800000";
},
{
  "name": "Stomper";
  "edition_code": "sto";
  "parent_code": null;
  "released_at": "1587679200000";
},
{
  "name": "Stomper Extras";
  "edition_code": "esto";
  "parent_code": "sto";
  "released_at": "1587679200000";
},
{
  "name": "Stomper Promos";
  "edition_code": "psto";
  "parent_code": "sto";
  "released_at": "1587679200000";
},
{
  "name": "Stomper Ultra";
  "edition_code": "usto";
  "parent_code": "sto";
  "released_at": "1587679200000";
},
{
  "name": "Roller";
  "edition_code": "rol";
  "parent_code": null;
  "released_at": "1374184800000";
}
]

【问题讨论】:

    标签: javascript arrays typescript sorting


    【解决方案1】:

    sort 函数不是您想要的。或者至少不只是一个单一的排序函数。

    这是您的工作流程:

    1. 制作一个仅包含父版本的过滤列表。按“发布时间”排序

    2. 制作一个仅包含子版本的过滤列表。按名称排序。

    3. 创建一个全新的空数组。遍历您的父列表。 foreach 父列表,将父项放入数组,然后找到所有匹配的子项,然后将它们放入数组中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      • 2017-03-19
      • 2018-10-09
      • 2015-07-03
      相关资源
      最近更新 更多