typescript-如果一个字段不为空,则按该字段对对象数组进行排序,如果该字段为空,则按另一个字段对对象数组进行排序

ih99xse1  于 2023-04-22  发布在  TypeScript
关注(0)|答案(1)|浏览(174)

我有一个API,它给出这样的响应(为了简洁和清晰,将其分配给一个变量)

let response = [{
    id: 6789,
    pageNumber: null,
    sequence: 1
  },
  {
    id: 3456,
    pageNumber: 2,
    sequence: 3
  },
  {
    id: 1234,
    pageNumber: 1,
    sequence: 5
  },
  {
    id: 8967,
    pageNumber: null,
    sequence: 2
  }
]

现在,如果它不为空,我必须按pageNumber排序,如果它为空,则按sequence排序。但pageNumber的值不为空应该是第一个。因此,结果应该如下所示

[{
    id: 1234,
    pageNumber: 1,
    sequence: 5
  },
  {
    id: 3456,
    pageNumber: 2,
    sequence: 3
  },
  {
    id: 6789,
    pageNumber: null,
    sequence: 1
  },
  {
    id: 8967,
    pageNumber: null,
    sequence: 2
  }
]

我看了很多解决方案,但大多数都是JS的。当我在TS中尝试时,就像这个

response.sort((r1: any, r2: any) => {
    return (r1.pageNumber === null) - (r2.pageNumber === null) || r1.pageNumber - r2.pageNumber || r1.sequence - r2.sequence;
});

我得到一个错误说:
算术运算的左侧必须是“any”、“number”、“bigint”或枚举类型。
我该如何纠正我的排序方法,或者我应该用不同的方法?注意:所有对象都有sequencepageNumber可以为null。

1l5u6lss

1l5u6lss1#

把布尔值转换成数字,这就成功了。

response.sort((r1: any, r2: any) => {
  return (+((r1.pageNumber as any) === null) - +((r2.pageNumber as any) === null) ||
    r1.pageNumber - r2.pageNumber ||
    r1.sequence - r2.sequence
  );
});

相关问题