我有一些数据正在尝试使用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
任何人都可以提供帮助吗?我知道为什么它的排序是这样的,因为它正在逐位进行并正确排序,但有没有人找到一些稍微好一点的排序?
答案 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室。