【问题标题】:Sorting with Angularjs OrderBy in special cases在特殊情况下使用 Angularjs OrderBy 排序
【发布时间】:2013-08-03 12:41:23
【问题描述】:

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

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

【问题讨论】:

    标签: javascript sorting angularjs


    【解决方案1】:

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

    <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

    【讨论】:

    • 如果感觉有风险,return parseInt(item.room, 10); 也可以;)
    【解决方案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 房间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-14
      • 2016-05-18
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多