【问题标题】:AngularJS - Sorting ng-repeat on string with numbers in themAngularJS - 对带有数字的字符串进行 ng-repeat 排序
【发布时间】:2014-09-10 13:34:13
【问题描述】:

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

除其他外,我的对象包含一个名称字段。此名称字段还可以包含数字,例如: 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 似乎不会正常订购它。但我宁愿不这样做,因为数据通常是通过轮询来更新的。另一种方法是强制前导零,但由于用户手动输入这些内容,我不确定我是否应该这样做。

而且,它不仅是带有数字的名字,所以我不能完全把它们删掉

那么,有什么建议可以让这个列表正常显示吗?

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

【问题讨论】:

  • 你应该编写自己的排序函数。
  • 搜索“自然排序”。
  • @dfsq 我可以做到这一点,但我怎么知道有数字和没有数字之间的区别。我该如何给他们正确的顺序?
  • @blackhole,我在提交之前已经尝试过了,但如果你想正确地按多列排序,这似乎并不奏效。如果我无法解决,我会进一步调查并发布一个 jsfiddle。
  • 为什么我的问题是-1?它有足够的信息来创建答案,不是吗?

标签: javascript string angularjs sorting numbers


【解决方案1】:

您可以在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

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

使用 naturalSort 在控制器中进行手动排序,而不是使用 ng-repart 进行排序

$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/

【讨论】:

  • 我已经清理了一下:它还包含普通字符串,所以我也需要保留它们。
  • 那我给你指点overset.com/2008/09/01/javascript-natural-sort-algorithm,建议你在controller做手动排序,而不是ng-repeart
  • 更新了答案!如果旧答案适合您,您可以删除旧答案!
  • 我找到了这个blog.overzealous.com/post/55829457993/…。可能这应该对你有用! Jsfiddle 演示它 - jsfiddle.net/wE7H2/3
  • 我已经尝试了您的解决方案并最终进行了轻微调整。主要是因为我有多个列可以过滤并用承诺刷新我的代码。我也没有使用这个 naturalsort 库,但在这里找到了一个类似的库:bennadel.com/blog/…。但是感谢您为我指明了正确的方向。
猜你喜欢
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
相关资源
最近更新 更多