2014-09-10 120 views
0

我有一个表视图中的对象列表,我想正确排序。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-重复这样的: seat in seats | orderBy:orderField:orderReverse track by seat.id 哪里orderfield一些变量是点击表头时设置和orderReverse太扭转。

我试图使自定义过滤器,以确保其行为正常,但我失败了。看起来,Javascript只是不会正常排序,除非我打破了字符串。但我宁愿不是因为数据经常通过轮询更新。另一种方法是强制引导零,但因为用户手动输入这些东西,我不知道我是否应该。

而且,它与一些数字不仅名字,所以我不能只是完全切断他们

那么,如何使这个名单显示通常有什么建议?

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

+0

你应该写自己的排序功能。 – dfsq 2014-09-10 13:35:52

+0

搜索“自然排序”。 – Blackhole 2014-09-10 13:42:33

+0

@dfsq我可以做到这一点,但我怎么会知道与数字和没有区别。我将如何给他们正确的顺序? – Martinspire 2014-09-10 14:23:18

回答

4

您可以使用自定义排序函数orderBy(可能需要自定义的排序功能太)

在你的控制器定义排序功能:

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

,然后在模板

seat in seats | orderBy:sorter track by seat.id 

编辑按照修改后的问题陈述:

做手工分拣的控制器,而不是与NG-repeart使用naturalSort

$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); 
}) 

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

+0

我已经清理了一下:它也包含正常的字符串,所以我需要保持它们。 – Martinspire 2014-09-10 14:22:43

+0

然后我会告诉你http://www.overset.com/2008/09/01/javascript-natural-sort-algorithm/ 并建议你在'controller'中手动排序而不是'ng- repeart' – Prasad 2014-09-10 14:50:13

+0

更新了答案!如果后者适合你,你可以删除旧的答案! – Prasad 2014-09-10 14:58:37

相关问题