1

我有一些数据正在尝试使用 Angular 的orderBy过滤器在表格中进行排序。这是我试图排序的数据。

[
  {
    "name":"John Doe",
    "room":"1M-103",
  },
  {
    "name":"Joe Schmoe",
    "room":"12M-353",
  },
  {
    "name":"Bob Guy",
    "room":"13M-546",
  },
  {
    "name":"Another Person",
    "room":"12M-403",
  },
  {
    "name":"Fred No-name",
    "room":"3M-204",
  },
[

所以按名称排序就可以了。然而,按房间排序是另一个问题。我以完全相同的方式对其进行排序。这是我希望在排序后的样子:

1M-103
3M-204
12M-353
12M-403
13M-546

排序后它的实际外观是这样的:

12M-353
12M-403
13M-546
1M-103
3M-204

有谁能帮忙吗?我知道为什么要这样排序,因为它会逐位正确排序,但是有人发现有什么方法可以得到更好的排序吗?

4

2 回答 2

4

您可以创建一个自定义排序器来执行此操作。

<li ng-repeat="item in items | orderBy:mySorter">{{item}}</li>

$scope.mySorter = function (item) {
    return Number(item.room.split('-')[0].replace('M', ''));
}

我还为您创建了一个演示。

更新

您还可以使用正则表达式:

$scope.mySorter = function (item) {
    return Number(item.room.replace(/[^\d]/g, ''));
}

Demo

于 2013-08-02T21:16:19.937 回答
2

实际上 sza 的答案并不完全有效,因为它只考虑了字母“M”之前的数字。因此,以 12M 开头的所有内容都将被读取为“12”并被视为相等。所有 12M 将出现在 11M 之后和 13M 之前,但随后会在其他 12M 中以随机顺序显示。

我整理了这段代码:

<li ng-repeat="item in items | orderBy:mySorter">{{item}}</li>

$scope.mySorter = function (item) {
    return Number(item.residenceRoom.replace('M', '.').replace('-', ''));
}

它根据 M 点之前的数字和 M 之后的数字创建一个十进制数。因此 12M-353 将是“12.353”,而 12M-403 将是“12.403”,因此它们将被正确排序。

我看到的唯一问题是房间号是否总是 3 位数。例如,假设房间 1M-2 将被排序为“1.2”,而房间 1M-103 将被排序为“1.103”,因此房间 2 将在房间 103 之后排序。但是您可以通过将所有房间格式化为 3 来轻松解决此问题数字,例如。房间 1M-002。

于 2013-08-02T23:55:26.877 回答