AngularJS - 对包含数字的字符串进行 ng-repeat 排序

Mar*_*ire 0 javascript sorting string numbers angularjs

我有一个表视图中的对象列表,我想正确排序。

除其他外,我的对象包含一个名称字段。此名称字段还可以包含数字,例如: Chairman Seat 1 Seat 2 Seat 3 Seat 11 Seat 12 Seat 23 Secretary

然而,这是这样排序的: Chairman Seat 1 Seat 11 Seat 12 Seat 2 Seat 23 Seat 3 Secretary

按名称排序时,这似乎不是对我的列表进行排序的自然方式。

现在我正在使用这样的 ng-repeat: 单击表标题时设置的变量 seat in seats | orderBy:orderField:orderReverse track by seat.id 在哪里orderfield,orderReverse也用于反转。

我尝试制作自定义过滤器以确保其正常运行,但我失败了。除非我拆分字符串,否则 Javascript 似乎不会正常排序。但我宁愿不这样做,因为数据通常是通过轮询来更新的。另一种方法是强制前导零,但由于用户手动输入这些东西,我不确定我是否应该这样做。

此外,它不仅包含数字的名字,所以我不能完全切断它们

那么,有关如何使此列表正常显示的任何建议?

编辑:清除了有关该问题的一些信息。

Pra*_*sad 5

您可以使用自定义排序功能orderBy(它也可以使用自定义排序功能)

在你的控制器中定义一个排序函数:

$scope.sorter = function (a){
   return parseInt(a.replace( /^\D+/g, '')); // gets number from a string
}
Run Code Online (Sandbox Code Playgroud)

然后在你的模板中

seat in seats | orderBy:sorter track by seat.id
Run Code Online (Sandbox Code Playgroud)

根据修改后的问题陈述进行编辑:

使用自然排序在控制器中进行手动排序,而不是使用 ng-repeart

$scope.seats = [{"id": "Seat 12"},{"id": "Seat 3"},{"id": "Seat 1"},{"id": "Seat 2"},{"id": "Secretary"}];
$scope.seats.sort(function(a,b) {
    return naturalSort(a.id, b.id);
})
Run Code Online (Sandbox Code Playgroud)

或检查这个角度模块http://blog.overzealous.com/post/55829457993/natural-sorting-within-angular-js和演示它的小提琴 - http://jsfiddle.net/wE7H2/3/