在特殊情况下使用Angularjs OrderBy进行排序

时间:2013-08-02 21:07:42

标签: javascript sorting angularjs

我有一些数据正在尝试使用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

任何人都可以提供帮助吗?我知道为什么它的排序是这样的,因为它正在逐位进行并正确排序,但有没有人找到一些稍微好一点的排序?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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室。